4

私自身のコーディングスキルを維持するために、私は最近、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

4

1 に答える 1

6

さて、これは急いで行われましたが、ブロックがあなたが押す正方形であり、グループが私の図面と同じ色の3つ以上の隣接するブロックのコレクションであると仮定すると、あなたが直面している問題はあなたが同じ方法でやりすぎです。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ブロックを押すときは、コントローラーに通知する必要があります。これは、これがグループの一部であるかどうかを決定する必要があります。その場合、グループに火をつけますか?(私は用語に精通していません)。次に、このグループのブロックに、ON_FIREなどの新しい状態を指定する必要があります。モデルは、これらのブロックがON_FIREになったことをすべてのオブザーバーに通知します。ビューがこの情報を取得したら、ON_FIREアニメーション、折りたたみなどを実行します。これが完了すると、に対応するはずです。timeLine.onFinnish次に、たとえば、コントローラで次のメソッドを呼び出しますcompletedBurning。これは、新しいものをクリーンアップして間接的にトリガーする役割を果たします。

これが理にかなっていることを願っています。

クラス図

于 2012-11-11T14:34:36.233 に答える