以前、連鎖処理について質問させて頂いた者です。
たびたび申し訳ありませんが2点質問をさせて頂きたいと思います。
今回は回転処理と削除アニメーションについてです。
回転処理の方がflagで管理しており、時計回りに回転すると言う形にしてみたのですが回転した後、フィールドに固定する際の処理に問題が発生している状況です。ブロックの固定はメイン関数の方で処理しているのですが移動用の関数内でブロックの固定処理をした方が良いのでしょうか?
削除アニメーションに関しまして、αブレンドを使って4つ以上並んだ画像を薄くして実際に削除処理に移るという形をとりたいと考えているのですが、この際別関数を作り制御した方が良いのでしょうか?
ソースコードなのですが、何分長くなってしまい掲示板の文字数をオーバーしてしまうので添付ファイルという形をとらせて頂きました。
どうか、宜しくお願い致します。
回転処理と削除アニメーションについて
Re:回転処理と削除アニメーションについて
私だったら…ですが、落ちてくるブロック用の構造体かクラスを用意します。
例えばこんな感じですね。
で、ブロックが消える前に一旦その『これから消えるブロックです』という情報を保持しておきたいならば…
消える箇所を検索して、4つ以上繋がっている箇所の消去フラグを1にして、次に消去フラグが1の箇所だけ表示を薄くして、実際に消去する…みたいな流れですね。
struct PIECE { int color[3][3]; int x; int y; };
例えばこんな感じですね。
で、ブロックが消える前に一旦その『これから消えるブロックです』という情報を保持しておきたいならば…
struct FIELD { int color[FIELD_MAX_Y][FIELD_MAX_X]; // ブロックの色 int vanish[FIELD_MAX_Y][FIELD_MAX_X]; // 消去判定フラグ(普段は0で、1の時に消える) };こんな風にフィールド上の1マス1マスに消去フラグを持たせると処理が楽ではないでしょう?
消える箇所を検索して、4つ以上繋がっている箇所の消去フラグを1にして、次に消去フラグが1の箇所だけ表示を薄くして、実際に消去する…みたいな流れですね。
Re:回転処理と削除アニメーションについて
ためしにメイン関数以外の部分の実装をしてみました。メイン関数の実装はお任せします(他力本願)
当然ながら動作は未確認ですが、多分大丈夫じゃないかな?(^_^;)
これらの関数を並べていけば、とりあえずはぷよぷよの動きになるんじゃないかと思います。
※クラスを使わずに書くのは久しぶりだったので、妙に気をつかってしまいました(苦笑)
当然ながら動作は未確認ですが、多分大丈夫じゃないかな?(^_^;)
これらの関数を並べていけば、とりあえずはぷよぷよの動きになるんじゃないかと思います。
※クラスを使わずに書くのは久しぶりだったので、妙に気をつかってしまいました(苦笑)
Re:回転処理と削除アニメーションについて
バグさん、ありがとうございます!
頂いたサンプルソースのmain関数を作り、参考にさせて頂きながら自分なりのソースコードを作っていこうと思います。
何から何まで本当にありがとうございました!
頂いたサンプルソースのmain関数を作り、参考にさせて頂きながら自分なりのソースコードを作っていこうと思います。
何から何まで本当にありがとうございました!
Re:回転処理と削除アニメーションについて
あ、1つ実装を忘れている関数がありました(^_^;)
下記の関数を追加しておいてください。PIECE構造体の情報をFIELD構造体へセットする関数です。
下記の関数を追加しておいてください。PIECE構造体の情報をFIELD構造体へセットする関数です。
/* PIECE情報をFIELDにセットする */ int PieceToField(PIECE* pPiece, FIELD* pField) { int i, j; /* PIECEとFIELDの重なり判定を行う */ if (PieceCollision(pPiece, pField) == 0) { /* 重なっている箇所が有る場合は0を返す */ return 0; } for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { /* 空白の箇所は何もしない */ if (pPiece->Color[j] == 0) { continue; } /* FIELDへPIECE情報をコピーする */ pField->Color[pPiece->X + i][pPiece->Y + j] = pPiece->Color[j]; } } /* セットに成功したので1を返す */ return 1; }