0

DirectX を使用して、C++ でグラフィカルに単純な 3D ゲームを作成しています。私が抱えている主な問題は、いくつかのものを効率的に構造化する方法です。現在、特定の領域の目標はわかっていますが、それらを理想的に実行する方法はわかりません。

たとえば、現在、すべてのメッシュとテクスチャを Asset クラスに格納し、列挙された定義が各アセットを指すようにしています。Asset オブジェクトを作成して初期化することにより、ゲームの開始時にすべてのメッシュとテクスチャが読み込まれます。そこから、アセット オブジェクトによって指定されたポインターを割り当てることによって、メッシュとテクスチャをオブジェクトに読み込みます。これが最善の方法ですか?

より難しいトピックは、アイテムのトピックです。議論のために、私たちは風景を扱っていると言います。現在、私の風景には次のものが必要です。

  • 名前
  • メッシュ
  • テクスチャ (オプション)
  • フラグ (破壊可能、可燃性など)
  • ステータス (燃焼中、ロック中、呪われているなど)
  • 能力(燃焼時にダメージを受けるなど、オブジェクトが実際に行うこと)

このリストの最初の 5 つの項目は単なる変数です。しかし、能力は私を悩ませています。最初の 5 つはすべて 1 つのアイテム クラスに存在できます。しかし、私がどうすればよいか分からないのは、どういうわけかオブジェクトに能力を付加することです.

例えば; オブジェクトに「Fire Nova」能力を持たせたい。各ターンの開始時に、オブジェクトは近くにあるものすべてにダメージを与えます。

私にとって、これは、各オブジェクトに「Trigger_Phase_TurnStart()」または同様の名前のメソッドが必要であり、そのトリガーに対する独自のアクションと独自の追加変数 (Damage、Range など) を持つ新しい「Fire Nova」クラスが必要になることを意味します。 )。これで、基本オブジェクト クラスと、それを継承する新しい Fire Nova クラスができました。

しかし、Fire Nova と Frost Nova に加え、Slowing Aura などの能力を持つオブジェクトが必要だとしたらどうでしょう。基本的に、オブジェクトごとに新しいオブジェクト クラスを必要とせずに、トリガーされた効果をオブジェクトに追加する方法が必要です。

したがって、最後には次のように言えます。

(pseudo code of the object's components)
name = Elemental Orb
mesh = "Mesh_Sphere"
textures[] = "Tex_Ice", "Tex_Fire"
flags = OF_Destructible
status = SF_Cursed | SF_Burning
abilities[] = Fire_Nova, Frost_Nova, Slowing_Aura

そして、このオーブは、これらすべての属性を持つ単純なオブジェクト クラスになります。その後、オブジェクトは、実行するアクションの適切なターン フェーズで、格納されている各能力のトリガーをアクティブにします。

現在、すべてのターン フェーズまたはアクション トリガー (基本アビリティ クラスから継承) を持つアビリティごとにクラスを作成し、オブジェクトがアビリティの配列から呼び出したときに適切なアクションを実行させる必要があるかもしれないと考えています。これはこれを行うための最良の方法でしょうか?

別問題として。一部のフラグでは、他の方法では不要な追加の変数が必要になります。たとえば、Destructible はオブジェクトにヘルスがあることを意味しますが、フラグがなければそれは必要ありません。または、Openable アイテムにはコンテンツの配列が必要です。これらの変数を必要なときに配分する良い方法は何でしょうか? たとえば、すべての壁にヘルスと空のコンテンツ配列を含める必要はありません。

ついに。上記の箇条書きの属性がすべてアイテムに必要であると仮定すると、それらをどのように保管するのが最善でしょうか? 明確にするために、私は書くことができるようにしたいと思います:

CreateItem(ITEM_CHAIR);

これにより、名前、メッシュ、テクスチャ、フラグ、ステータス、および能力を含む作成されたオブジェクトが返されます。このような最終効果を達成するには、どのような構造が適しているでしょうか?

要約すると:

  1. 現在のアセット ストレージは実現可能ですか?
  2. 多数の個別のオブジェクト クラスを作成せずに、オブジェクト クラスにアタッチする機能を作成する最善の方法は何ですか?
  3. 関連するフラグが存在しない場合に、変数 (または少なくともメモリ使用量) を制限する方法はありますか?
  4. 固定アイテムの定義を格納するのに最適な構造または形式はどれですか?

これが少し長くなっている場合は申し訳ありません。すべての質問に答えられない場合でも、1 つだけ答えていただければ幸いです。質問 2 は、現在、おそらく私にとって最大の優先事項です。

御時間ありがとうございます :)

4

1 に答える 1

0

質問 2 のみに回答したいのですが、デコレータ パターンが必要なようです。OOP では、多くの材料があり、オブジェクト (ピザなど) を装飾したい場合に、デコレータ パターンが役立ちます。残念ながら、成分ごとに個別のクラスを作成する必要があるため、正しいアプローチがあると思います。良い点は、デコレータ パターンを使用すると、オブジェクトを abilites クラスで何度もラップし、最後に 1 つのメソッドだけを呼び出してすべてを実行できることです。

于 2012-07-20T01:16:18.050 に答える