前回の続きからです。
いよいよテトリス制作も終盤、今回は埋まっているラインを判定しライン消去する処理を作っていきます。
1.行がブロックで埋まっているか判定する処理の作成
ブロックの有無は BoardLayout で管理しているので、一行ずつ埋まっているかチェックをしていけば良いです。Tetris ブループリントを開き、DeleteLine という名前の関数を作成。
繰り返し処理の計算に変数が必要なので、Local Variables に以下の変数を追加します。
変数名 | 型 | 初期値 |
Iy | Integer | 0 |
Iz | Integer | 0 |
Jy | Integer | 0 |
Jz | Integer | 0 |
DeleteFlag | Boolean | false |
処理は以下のように組みます。
実はこれでは無限ループになってしまっているのですが、後々ここに Iz の加算処理を追加するので、それがある前提で見てください。
壁の内側のマスの数だけループし、行毎に空間があるか判定しています。
行のループが終わる度(Iy のループが Completed になる度)に DeleteFlag が True かをチェックすれば、その行を消してよいかが判断できます。
行消去の処理を Iy ループの Completed から以下のように繋げ組みます。
当該行が消去対象であればその行の値は必要ないため、一行上の値を上書きしています。
そのシフトを最上行の手前まで行っています(最上行の上は存在しないため)。最上行にはゼロを入れます。
行のシフトが行われるので、ライン消去を行った場合は Iz の加算は行いません。
そのため、DeleteFlag が False のときしか加算しないように組んでいます。
2.BoardLayout の最新状態を表示させる処理の作成
DeleteLine を実行に組み込む(ShiftQueue が配置されている箇所等)と動作はしますが、BoardLayout の値しか変更されていないため画面の表示は変化しません。BoardLayout の状態を画面に反映させる処理を作る必要があります。
Tetris に RefreshViewOnBoard という名前の関数を作成します。
処理は以下のように組みます。
単純に Tetris で管理している Block02 ~ 08 のインスタンスメッシュをすべて削除し、BoardLayout に従って新しくメッシュを追加する処理となっています。
では今回作った関数を実行処理に組み込みましょう。
InsertControlledBlockToBoard の末尾、ShiftQueue を実行する箇所に DeleteLine と RefreshViewOnBoard を差し込みます。
テストプレイをしてみると、しっかりライン消去が行われているのが確認できます。
-目次-
Part.00.説明
Part.01.キューブの作成
Part.02.フィールドの作成
Part.03.様々な形のブロックの作成
Part.04.カメラとブロックの配置
Part.05.ブロックの移動処理
Part.06.ブロックの接地処理
Part.07.ライン消去処理
Part.08.自動落下とゲームオーバー処理
Part.01.キューブの作成
Part.02.フィールドの作成
Part.03.様々な形のブロックの作成
Part.04.カメラとブロックの配置
Part.05.ブロックの移動処理
Part.06.ブロックの接地処理
Part.07.ライン消去処理
Part.08.自動落下とゲームオーバー処理
0 件のコメント:
コメントを投稿