1

私は楽しみのためにC#/ XNAでヘビゲームを作成していますが、それはいくつかの優れたオブジェクトデザインを練習する良い機会です。

ヘビオブジェクト

基本的にリンクリストであるスネークオブジェクトがあり、各ノードはマップに関連するXおよびY座標を持つベクトルです。

また、ヘビが食べたばかりかどうか(この場合、この更新では最後のボディノードは削除されません)、ヘビが移動している方向など、いくつかのプロパティがあります。

マップオブジェクト

マップ(ゲームエリア)は、その内容を整数の2D配列内に保持します。プリミティブの配列を使用してマップを格納すると、メモリ消費が抑えられ、ベクトルの配列よりも高速(かつ簡単)に反復できます。

コンテンツは列挙型{Empty、Wall、Snake、Food}内で定義され、配列内の関連する座標に格納されます。

マップ内のスネークオブジェクトへの参照も保持されるため、renderを呼び出すたびに、スネークを構成するノードをループして、マップ上の正しい位置にレンダリングします。

質問!!

私の質問は...この結合がきつすぎるかどうかです。その場合、何か提案(つまりオブザーバーパターン)がありますか、それともこの状況で大丈夫ですか...

マップで使用されている座標系を知る必要からヘビを切り離す方法を考えようとしましたが、それを機能させ、各ノードの相対的な位置を維持する方法を考えることはできません-他の。

どんな答えもありがたいです、乾杯!

4

3 に答える 3

0

私はあなたがすでにあなた自身で答えをほのめかしていると思います。マップで参照されるスネークを作成する現在の設計は、2つの間の緊密な結合です。

が実装するMapListenerような別のインターフェースの作成を検討することをお勧めします。SnakeSnake、マップが公開するイベントをリッスンし、それに反応して、公開してSnakeいるイベントのサブスクライバーを効果的に作成Mapします(あなたが言うように正しい位置にレンダリングするなど)。リスナーのArrayListを使用することもできるので、ゲームがより複雑になったときにマップ内のイベントに反応する新しいオブジェクトをマップに追加する柔軟性があります。

リスナーの作成に関するリファレンスについては、このSOの質問を参照してください。カスタムリスナーをコーディングするにはどうすればよいですか。この例ではダウンロードの終了をリッスンしていますが、ゲームのカスタムリスナーを作成するために受け入れられた回答のパターンを確認できるはずです。説明が必要な場合はお知らせください。ケースに合わせてコードを調整します。

于 2011-10-23T20:52:14.307 に答える
0

「このカップリングはきつすぎますか?」いいえ、そうではありません。

この場合、カップリングを切り離すために必要なコードは、カップリングを使用して単純に実装するために必要なコードよりも大きく、複雑で、保守が困難です。

さらに、常にある程度の結合が必要になります。「座標系」への結合は、通常、ゲーム開発におけるそれらの1つです。実際、マップとスネークオブジェクトを厳密に分離することはできますが(これも努力する価値はありません)、通信するには共通の座標系を共有する必要があります。

于 2011-10-24T03:08:31.723 に答える
0

これが単純な最初の思考構造です:

 create an interface called MapContainable
 //marker interface
 interface MapContainable {
 }

 interface MapMovable extends MapContainable {
   ///map movement specific contract methods here
 }

class Snake implements MapMovable {
.....
}

このように、マップはヘビや食べ物などと呼ばれる具体的なオブジェクトがあるかどうかを知る必要はありません。ヘビオブジェクトはマップの存在を知る必要はありません。ヘビが動くだけ!

于 2011-10-25T08:52:57.113 に答える