16

最近、C# でゲームのコーディングを試みています。これには XNA を使用していません。ゲームを最初からコーディングすれば、より多くのことを学べると思ったからです (ただし、マルチメディア エンジンを使用しています)。

私は 2D RPG ゲームを設計しようとしています - 少し野心的ですが、少なくともゲームの基本的な部分 (つまり、「ボイラー プレート」コード) をかなりよく理解しており、一部に到達しました。ここからどこへ行けばいいのかわからない場所。

2D ゲームでは、さまざまな「エリア」を歩き回ってゲームを進めます。「ポータル タイル」にヒットすると、次のエリアなどに移動します。

これらのエリア オブジェクトを設定する方法がわかりません。これが私の最初のアイデアでした。各エリアにはいくつかの異なるコレクション構造があります (たとえば、可視性四分木、衝突四分木、AI エンティティ リストなど)。したがって、敵エンティティをゲームに追加する場合、それは可視性クワッドツリー、衝突クワッドツリー (エンティティと衝突できるため)、および AI エンティティ リストに配置されます。エリアが更新要求を受け取ると、これらの各構造体に自分自身を更新するように指示し、次にエンティティに自分自身を更新するように指示します。これまでのところ、すべて順調です。

私の質問は次のとおりです。この敵が他のオブジェクトと通信する必要がある場合はどうなりますか? たとえば、プレイヤーが特定の範囲内にいるかどうかを知る必要がある場合があります。または、プレイヤーによってヒットされたかどうか。または、すべての衝突可能なオブジェクトが領域内にある場所 (経路探索が可能)。

この問題に対する最初の (そして悪い) 解決策は、単純に各エンティティに各コレクションへの参照を渡すことです。しかし、これは明らかに密結合オブジェクトを助長しますが、これは良くありません。

私が思いついた 2 番目の解決策は、各エンティティがメッセージ構造を介してエリアを照会できるようにすることでした。したがって、敵は「自分の位置から X の距離内にある各エンティティのリストをください」と言うことができ、そのエリアは答えを返します。しかし、この領域にさらに多くの可能性をコーディングする必要があるため、これはますます難しくなります (「自分から X 距離以内にないエンティティのリストをください」、「自分の X 距離以内にないエンティティのリストをください」 ×」など)。

私が探しているのは、このオブジェクト間通信の問題に対する定評のある解決策であり、基本的にエリアを設定する方法です。確かではありませんが、ある種のメッセージングシステムも必要になると思います。

読んでくれてありがとう。

4

4 に答える 4

5

Mediator patternを調べることができます。結合を低くすることができますが他のオブジェクト間の通信を容易にするために、メディエーター オブジェクトに多くのコードを含めることになります。でも、どちらかだと思います。そして、これが好ましいです。また、特定の更新リクエストをキューに入れ、より適切なタイミングでリクエストを処理したり、大量のリクエストを 1 つずつ処理する代わりにバッチ処理を行ったりするなど、より自由にトリックを実行できるようになります。オーバーヘッド。

于 2009-11-05T01:31:20.977 に答える
5

この種のことに対する最良の選択肢は、多くのオブザーバー パターンを使用することだと思います... イベントを作成し (どのように一般的か具体的かを決定することは別の設計上の決定です)、オブジェクトを必要なものにサブスクライブさせます。

たとえば、エンジンは 2 つのエンティティが近くにあるときに衝突または近接イベントを発生させることができますが、それらは関心のあるエンティティによってのみ受信されます。サブスクライブされたオブザーバーでこれらの条件のみをチェックするために、いくつかの最適化を行うことができます。

これがゲームで一般的な場所かどうかはわかりませんし、実際にどのゲームでも (まだ) 使用したことはありませんが、何度も考えてきましたが、これは私が最も気に入っているオプションです。

于 2009-11-05T01:10:49.053 に答える
3

管理を行うエンティティの上にオブジェクトがある場合、これは通常、はるかに簡単です。(例: 「世界」または「ゲーム」。)どのエンティティが他のどのエンティティに近接しているかを簡単に確認し、それに応じてイベントや通知を送信できます。

エンティティが更新されているときに意味のある決定を下すために、もう少しコンテキストが必要な場合は、何らかの形でそのコンテキストでいつでも世界を通過させることができます。ただし、エンティティに直接心配させるのではなく、世界がエンティティの分割と配置を管理できるようにします。

(また、なぜ四分木なのですか? 2D RPG の場合、粗いグリッドの方が実装がはるかに簡単で、同様に便利です。)

于 2009-11-05T10:58:08.283 に答える