HOME > ActionScript > テトリスアルゴリズム > システム その1

システム その1

裏方の処理

「システム」などと大げさな言い方をしておりますが、要するにゲームスタートやゲームオーバー、一時停止や強制終了など、ゲームを支えるもろもろの処理の事を私が勝手に分類しただけです。

ソースファイル pt8.zip

追加する機能としてはテトリミノの自動落下処理とゲームスタート、ゲームオーバーの処理に限定して機能を追加します。まずはゲームスタートとゲームオーバー処理の追加、次にテトリミノの自動落下処理の追加を扱います。

ゲームスタート

スタートと再スタート

スタートには2種類あります。起動時に一番最初に実行するスタートと、ゲームオーバーになってから再びゲーム開始を実行する再スタートです。同じ様ですが再スタート時には色々と初期化作業が含まれるので規模の小さいゲームプログラムでも割と違います。
以後は便宜上一番最初のスタートをファーストスタート、それ以外を再スタートと呼びます。

内部的にゲームスタートの処理は2種類ですが、設置するスタートボタンは当然一つなのでボタンインスタンスに登録するリスナー関数を2種類用意して、状況によってボタンインスタンスへの登録を切り替えます(といっても一番最初以外は全て再スタートです)。

ボタンインスタンスは前回までテスト用のupdateボタンを生成していたButtonCreaterクラスで用意しますが、スタートボタンを押した後はリスナー関数を削除する為、それに合わせてグレー表示になるように色を変える関数を追加しておきます(ButtonCreater.asファイル 100行目)。
明示的に「押せませんよ」的な外観に切り替える意図なのですが、やっつけな感じの関数追加なのでオブジェクティブな拡張ではない辺りには目をつぶって下さい。

ファーストスタート

ファーストスタートの為にスタートボタンに登録する処理には、前回までのInit()関数の中の幾つかの処理を分離してstartHandler()関数を作ります(main.asファイル 251行目)。
考え方としてはInit()関数の中には初期画面表示の為の処理以外は残さず、startHandler()関数にはキーイベントやフィールドの初期表示処理を割り当てます。

再スタート

再スタートの為のリスナー関数は、実はテスト用に使用していたupdateボタン用のリスナー関数がほぼそのままの内容で使用できるので、これをテスト用の関数から正式な関数へとして格上げします。名前もrestartHandler()と変更して運用して行きます(main.asファイル 274行目)。

規模が小さいのでファーストスタート、再スタートの処理にそれほど差はありませんが、共に重要な点は「ボタンが押された際にスタート用のリスナー関数を登録削除」する事です。

ゲームオーバー

ゲームオーバー条件

ゲームオーバーにすると言う事はつまるところ「ゲームオーバーの為の処理を実行する」事ですので、その為には何時それを実行するかの条件とタイミングを考える必要があります。
ゲームオーバー条件は最初の仕様定義のところで決めました。

「テトリミノの出現位置に固定されたテトリミノが存在した場合ゲームオーバー」

この条件を満たした場合にゲームオーバー用のプロセスへ移行します。

基本仕様 テトリミノはガイドライン通り4つのセルで一つを形成し、7種類存在。
テトリミノの色、出現時の向きはガイドラインに準拠。
固定フィールドの幅は10セル、高さは20セル。壁及び固定フィールド分の幅と高さを含めた、フィールドの完全サイズは幅12セル、高さ23セル。今回このサイズは固定で変動なし。
テトリミノの出現位置は固定フィールドの上。
テトリミノの出現位置に固定されたテトリミノが存在した場合ゲームオーバー。
固定後のテトリミノもガイドライン通りの7色で色分けする。
操作系 アローキー上で右回転。
アローキー左右で横移動。
アローキー下で落下速度アップ。

評価のタイミング

ゲームオーバー条件が「テトリミノの出現位置…」とありますので、ゲームオーバーかどうかを評価するタイミングは新しいテトリミノをフィールドデータに配置した直後です(main.asファイル 395行目)。

ゲームオーバー評価処理

実際にゲームオーバーかどうかの評価を行う処理のプロセスは、新しく用意したテトリミノのパターンデータがフィールドに配置された場合に何かに重なるかどうかを調べます。これは新しいテトリミノのパターンデータをフィールドデータに反映してしまったあとでは評価ができませんので(ぶつかっていたとしても反映した瞬間に固定される為)、フィールドデータに反映する直前にシミュレートを行って調べます。
調べた結果ゲームオーバーならゲームオーバー処理を実行、そうじゃなければ自動落下開始…という分岐になります。

ここまでの処理を把握していると気が付くかもしれませんが、実はこれと同じ処理が「回転」を行う際のアタリ判定を調べる処理の中にあります。ですので回転の処理の中にあるその処理を独立させたoverlapChecker()関数(main.asファイル 885行目)を用意します。これでsetTetromino()関数の中からもゲームオーバー判定時に実行可能になります。

他にsetTetromino()関数は戻り値を返しませんでしたが、ゲームオーバー評価の結果を真偽値で返す仕様になっています。

ゲームオーバーの演出

ゲームオーバー条件を満たしゲームオーバーとなると晴れてゲームオーバー用処理、onGameOver()関数(main.asファイル 309行目)が実行されます。この処理自体は演出的な処理ですので、その辺りはアルゴリズムとは直接関係ありません。ですので詳しくは触れませんが、この処理の中で重要な点があります。それはゲームオーバー処理が完了した時点でスタートボタンインスタンスに再スタート用のリスナー関数を再び登録する事です。これさえ行われれば、実際のところ後のプロセスは飾りです。

動作確認

テトリミノが動かない時はFlash画面上を一度クリックしてみてください。
まだ自動落下する機能がないので、多分わざと積み上げないとゲームオーバーにはならないですね。

今回の機能追加はあまりパッとしないかもしれませんが、システム部分は一時停止や効果音、必要な場合はキーコンフィグなどゲームプレイを支える処理も含めて考えると、実際のゲームのアルゴリズムと同じくらい重要な処理です。

というかボタンが小さくてすみません。

Flashファイルをご覧いただくためには、
アドビシステム株式会社のフラッシュプレーヤー(Flash Player)が必要です。
インストールされていない方は下のボタンから、最新版が無償で入手できます。

Adobe Flash Playerのダウンロード

ソースファイルについて

ソースファイルはasファイルのみです。

使用する環境としてはFlashIDE(動作確認はSC4のみ)を想定していますので。適当に用意したflaファイルに、ダウンロードしたソースファイルをドキュメントクラスとして適切に設定すれば問題無く動作します。
また、コーディングはFlashDevelopを使用して行っておりますので、プロジェクト内にファイルを適切に配置、もしくはクラスパスを設定するなどすればFlashDevelopだけでも問題なく動作します。Stageサイズは幅、高さともに500pxです。
申し訳ありませんが、ご質問等にはお答えできませんので、ご使用は環境に合わせて各自行ってください。

TOP