ゲームを問わず、通常のアプリでも大抵は「内部状態」というものを持っています。「コンテキスト」と呼ばれることもあります。
今回のアプリでは、簡単のため内部状態は3つしか持っていません。「落下開始」にゲーム終了判定をしました。ゲーム終了でなければ内部状態は「落下中」に遷移します。当たり判定を使って、これ以上下に移動できないと判断したら、内部状態は「着地」になります。
ブロックが着地したら、横一列にそろっているかどうかをチェックして、そろっていればラインを消す処理を行います。
ライン消去処理は連載第4回「コメントと制御文でJavaプログラムに“命”を吹き込め!」のbreak文の説明で引き合いに出しましたが、配列を下から順番に1つずつチェックしていくだけなので、特に難しくはありません。
以下はライン消去処理を実装したソースコードです。
消去する配列のインデックスを覚えておいて、点滅などの演出を行っています。
現時点の実装では、次に出現するブロックは、常に縦棒になっていますが、これでは面白みがありません。次に出現するブロックをランダムにするためには、JavaのRandomクラスを使用します。以下はランダム処理を実装したソースコードです。
前回、画面設計を以下のように決めました。
次のブロックを上記の場所に表示させる必要があるので、そのためのメソッドを1つ追加し、それをフィールドの描画と同じタイミングで呼び出せば実現できます。以下は、次のブロック表示を実装したソースコードです。
次のブロックと同様、消した合計ラインとスコアもメソッドを1つ追加し、同じタイミングで呼び出せば実現できます。以下はスコア表示を実装したソースコードです。
合計ラインやスコアは、ゲーム開始時に初期化する必要があり、ラインが消えたら更新しなければならないので、各状態で処理を追加しています。
操作を快適にするためにハードドロップを実装します。キーイベント処理内で上キーが押された際の処理と、キーバッファから取り出したキーが上キーだった際の処理を追加します。
ハードドロップは一気に下まで落っことす処理というのを特別に用意するのではなく、1つ落としては当たり判定を呼び出す、という繰り返しで実現しています。以下はハードドロップを実装したソースコードです。
最近のケータイはワンセグをフル画面で見られるように、画面サイズが従来の機種に比べて縦長(または、横長)になっています。いまのままの実装では、ワイドスクリーン機種では表示が切れてしまう可能性があるので、縦横のサイズがどんな組み合わせでも画面に収まるように対応します。
何もないところから機能を追加していき、ソースコードに実装が増えていくという体験を通してプログラミングの方法を説明しましたが、いかがだったでしょうか。最後に、前回と今回の実装の変更個所が段階的に分かる一覧を作成しましたので、おさらいしてみてください。
追加した機能 | 変更差分 | |
---|---|---|
フィールドを実装 | DoJa | MIDP |
自動落下を実装 | DoJa | MIDP |
キー操作を実装 | DoJa | MIDP |
当たり判定と着地判定を実装 | DoJa | MIDP |
ゲーム終了判定を実装 | DoJa | MIDP |
ライン消去処理を実装 | DoJa | MIDP |
ランダム処理を実装 | DoJa | MIDP |
次に出るブロック描画処理を実装 | DoJa | MIDP |
スコア表示を実装 | DoJa | MIDP |
ハードドロップを実装 | DoJa | MIDP |
ワイドスクリーン対応 (2008年9月29日追記) |
DoJa | MIDP |
また、今回までに実装したソースコードは以下からダウンロードできます。
Copyright © ITmedia, Inc. All Rights Reserved.