0

私はここ数ヶ月Javaゲームに取り組んでいますが、問題が発生しました。

私は、すべてが独自のタイルで構成さPlayerれているを歩き回っています。簡単に言えば、'が別のもの(ボックスなど)と衝突すると、プレーヤーは移動できなくなります。その部分は面倒を見てくれます。EnvironmentCollisionBoxPlayerCollisionBoxCollisionBox

階段やドアなどの特定のものと衝突すると何かが発生するInteractiveTilesを紹介しようとしています。具体的には、特定の* InteractiveTile *がヒットした場合に、新しいものに移行できるようにしたいです。PlayerCollisionBoxEnvironment

衝突マップを遷移して再描画する機能はありますが、その衝突イベントを環境に通知する方法がわかりません(これは、衝突イベントへのコードの階層では便利ではありません)。

私はEnvironmentこの衝突を「聞く」ことができるオブザーバーパターンに精通していますが、ここでどのように実装されるか、またはそれがこの状況に適したデザインパターンであるかどうかはわかりません。

さらに簡単に...

Player.IsCollidingWithDoorLeadingToNewEnvironment(newEnvironment)呼び出されるEnvironment.TransitionToNewEnvironment(newEnvironment)と、が呼び出される必要がありますが、コード構造内で互いに大きく離れています。

より広義には、メソッド/コンストラクターインジェクションのレイヤー上にレイヤーなしで2つのクラス間でメッセージを送信するにはどうすればよいですか?

4

1 に答える 1

1

Model-View-Controllerモデルについて聞いたことがありますか?それは派手なことではありませんが、多分それは役立つかもしれません。基本的に、プログラムは3つの部分で構成されます。

  1. モデル-これらはすべて、質問内のイタリック体の単語であり、プログラムを構成するために相互作用するプログラムの部分を表しています。
  2. 表示-表示; ここではそれほど重要ではありませんが、画面に物が描かれるのと同じです
  3. コントローラー-これは私があなたを助けると思うものです。これは、ショー全体を実行するクラスです。このクラスは、プログラムのモデルコンポーネントで生成されたすべてのパーツを制御し、これにより、それらが通信できるようになります。あなたの場合、Environmentクラスがこれに適していると思います。

コントローラクラスには、CollisionBoxesのように、ゲーム中に生成されたすべてのパーツを含む配列/ArrayListsが含まれている場合があります。各CollisionBox(私はこれを例として使用しています)は、配列内での位置を表すインスタンス変数(おそらくidと呼びます)を持つことができます(インデックス、intのように単純な場合もあります)。2つのボックスが衝突した場合、2つのIDを取得するコントローラークラスのメソッドを呼び出すことができます。これらのIDは、配列内のどこにあるかを参照するのに便利です。もちろん、他のデータ構造を使用することもできますが、これが基本的な考え方になることを願っています。

于 2013-03-27T04:13:35.673 に答える