パネポンのようなパズルゲームの消える判定ってどのように取っているのでしょうか?
思いつく限りだと
・位置情報をセルを取得し2次元配列に格納後処理
・直接位置情報から直接処理
この様な事が思いつくのですがイマイチしっくりきません。
パネポンのようなパズルゲーム
Re:パネポンのようなパズルゲーム
消える判定というのはパネルを入れ替えた後の処理ですか?
パズルゲームはオセロくらいしか扱った事無いので詳しくわかりませんが、思いついたことを書いてみます。
とりあえず、
・パネル1:1
・パネル2:2
・パネル3:3
・パネル無:0
・パネポンのルールのように縦、横同じ物が3つ並べば消える
として話を進めます。
↓画面と思ってください。(初期画面とします)
0000
1023
2021
2213
1211
では実際にどうやって消えるかの例を・・・。
①:パネルを入れ替える(配列の中身を入れ替える)
0000
1203
2021
2213
1211
↓
②:入れ替えてまずは入れ替えた場所の下にパネル無(0)が無いか判定してもしあれば入れ替える。
0000
1003
2221
2213
1211
↓
③:①で入れ替えた2つのパネルの縦、横を判定。
(判定するだけで消さない、消す位置を記憶させておく)
0000
1003
2221
2213
1211
↓
④:消す位置の配列の値を0(パネル無し)に。
0000
1003
0001
2013
1011
↓
⑤:消した位置の1つ上の配列の値を調べて0で無いならば入れ替える。
もし入れ替えて更にその上が0で無いならば入れ替えるを繰り返す。
これを値を0に変えた場所全てについて行う。(しなくて良い場所もありますが)
0000
0003
1001
2013
1011
こんな感じでどうでしょうか?
落ち物ゲームは作ったこと無いので参考程度にお願いします(^^;
パズルゲームはオセロくらいしか扱った事無いので詳しくわかりませんが、思いついたことを書いてみます。
とりあえず、
・パネル1:1
・パネル2:2
・パネル3:3
・パネル無:0
・パネポンのルールのように縦、横同じ物が3つ並べば消える
として話を進めます。
↓画面と思ってください。(初期画面とします)
0000
1023
2021
2213
1211
では実際にどうやって消えるかの例を・・・。
①:パネルを入れ替える(配列の中身を入れ替える)
0000
1203
2021
2213
1211
↓
②:入れ替えてまずは入れ替えた場所の下にパネル無(0)が無いか判定してもしあれば入れ替える。
0000
1003
2221
2213
1211
↓
③:①で入れ替えた2つのパネルの縦、横を判定。
(判定するだけで消さない、消す位置を記憶させておく)
0000
1003
2221
2213
1211
↓
④:消す位置の配列の値を0(パネル無し)に。
0000
1003
0001
2013
1011
↓
⑤:消した位置の1つ上の配列の値を調べて0で無いならば入れ替える。
もし入れ替えて更にその上が0で無いならば入れ替えるを繰り返す。
これを値を0に変えた場所全てについて行う。(しなくて良い場所もありますが)
0000
0003
1001
2013
1011
こんな感じでどうでしょうか?
落ち物ゲームは作ったこと無いので参考程度にお願いします(^^;
Re:パネポンのようなパズルゲーム
回答ありがとうございます。
決まった位置にパネルがあれば配列に入れて処理出来るかと思うのですが
あれって下から浮いてきて常にY座標が変わりますよね?
それをどのように配列に入れればよいのかがわからなくて・・・。
決まった位置にパネルがあれば配列に入れて処理出来るかと思うのですが
あれって下から浮いてきて常にY座標が変わりますよね?
それをどのように配列に入れればよいのかがわからなくて・・・。
Re:パネポンのようなパズルゲーム
配列は普通に2次元のデータで良いと思います。
↓こんな感じです。
--------------------
int panel[12][6];
--------------------
で、Y座標がドット単位でずり上がってくるのは描画の方でやってると思います。
(配列の中には、何色のパネルか?という情報だけ入れる)
例えば、パネルを単純に描画する関数を下記の様にします。
--------------------------------------------------
for(int i = 0; i < 12; i++){
for(int j = 0; j < 6; j++){
DrawGraph( j*32 , i*32 , Handle, TRUE ) ;
}
}
--------------------------------------------------
このままだと固定的な表示しか出来ないので、表示位置を変えるために
適当な変数を用意して、その変数を変えていきます。
(パネル一個は32×32ドットとします)
--------------------------------------------------
for(int i = 0; i < 12; i++){
for(int j = 0; j < 6; j++){
DrawGraph( j*32, i*32 + DifY, Handle, TRUE ) ;
}
}
--------------------------------------------------
DifYを 0 → -1 → -2 //中略// → -32 と言う風に変化させてやれば、
下からずり上がっているように見えると思います。
で、DifYが パネル一個分(32ドット)上昇したら、
その時に内部の2次元配列の値も1つずつ上にずらせばよいかな、と思います。
↓こんな感じです。
--------------------
int panel[12][6];
--------------------
で、Y座標がドット単位でずり上がってくるのは描画の方でやってると思います。
(配列の中には、何色のパネルか?という情報だけ入れる)
例えば、パネルを単純に描画する関数を下記の様にします。
--------------------------------------------------
for(int i = 0; i < 12; i++){
for(int j = 0; j < 6; j++){
DrawGraph( j*32 , i*32 , Handle, TRUE ) ;
}
}
--------------------------------------------------
このままだと固定的な表示しか出来ないので、表示位置を変えるために
適当な変数を用意して、その変数を変えていきます。
(パネル一個は32×32ドットとします)
--------------------------------------------------
for(int i = 0; i < 12; i++){
for(int j = 0; j < 6; j++){
DrawGraph( j*32, i*32 + DifY, Handle, TRUE ) ;
}
}
--------------------------------------------------
DifYを 0 → -1 → -2 //中略// → -32 と言う風に変化させてやれば、
下からずり上がっているように見えると思います。
で、DifYが パネル一個分(32ドット)上昇したら、
その時に内部の2次元配列の値も1つずつ上にずらせばよいかな、と思います。
