私自身のコーディングスキルを維持するために、私は最近、JavaFx 2.0を使用してJavaでこのゲームのバージョン(ブロックブラスター)を構築しています。それは私の利益のためだけだったので、ソフトウェアパターンやデザインについての本当の考えはなく、すべてのゲームロジックはGUIクラスになり、機能を追加するにつれてますます肥大化しました。私はついにコードベースをリファクタリングして、ゲームロジックとモデルをプレゼンテーション(GUI)から分離することにしました。
いくつかの調査の後、MVCやMVPのようなものを使用することにしました。そうすることで、アニメーション(起動時にゲームグリッドを上にスライドするブロック、ゲームから削除されるときに点滅するブロックなど)をビューレイヤーの一部にすることにしました。
これが引き起こす問題は、ユーザーがブロックを起動し、コントローラーがビューにブロックを移動するように指示するとtimeline
、アニメーション用のJavaFxが作成され、が呼び出されることtimeline.play()
です。そうすることで、アニメーションの実行中にプログラムフローがビューで一時停止することはないため、ビューメソッドはアニメーションを開始したばかりで戻ります。つまり、コントローラーは、ブロックがブロックのグループを作成したかどうかのチェックに進みます。もしそうなら、移動アニメーションがどこかに行く前にそれらを削除します。
古い(厄介な)実装ではtimeline.onFinish
、アニメーションが完了したらブロックグループチェックを呼び出すためにを使用しましたが、timeline
現在はビューとコントローラーのチェック機能にあるため、これを新しいデザインに配置する方法がわかりません。
JavaFxアニメーションが終了するのを待つ方法はありますか(アプリケーションスレッドをスリープ状態にすることなく)、またはこれらの問題を回避するのに役立つ別のデザインパターンを使用する必要がありますか?
コントローラからのコード
public void fire()
{
//Get the current column the launcher is in.
int x = launcher.getX(), startY = launcher.getY();
//Find the next available block in the column.
int endY;
for(endY = h; endY > 0 && blockMap[endY - 1][x] == null; endY--){}
//Create a new block of the same colour and location as that on the launcher.
addBlock(x, launcher.getY(), getCurrentColourAndRotate());
//Move the block in the GUI and model (this will trigger the animation in the GUI)
moveBlock(x, startY, x, endY);
//Remove any block groups that have been made.
checkBlock(blockMap[endY][x]);
//Remove any blocks now not connected to the top of the game grid
removeUnconnectedBlocks();
}
サンプルゲームのスクリーンショット
(出典:myhappygames.com)