さまざまなタイプのエンティティのリストの管理-より良い方法はありますか?


9

私はモバイルデバイス用の2Dスペースゲームを開発していますが、それは非常に複雑になり、私のソリューションは本当に混乱し、多くの繰り返しコードセグメントを生成します。

私は次のような異なるオブジェクトの複数のリストを持っている世界クラスを持っています:

List<Enemy> enemys;
List<Projectile> projectiles;
List<Collectable> collectables;
List<Asteroid> asteroids;
List<Effect> effects;
..

各リストは、ワールドクラスによって更新されます。しかし、それだけではありません。各敵には、エンジンのリストと、敵によって更新される武器ランチャーのリストがあります。これで、各エンジンがいくつかの火の効果をワールドリストの「効果」に追加し、各武器の発射者が発射物をワールドリストの「発射体」に追加します。これらすべてのクラスには異なるパラメーターがあるため、クラスごとに追加の更新と追加のレンダリング関数が必要です。

少なくとも、それらはすべて「GameObject」の子であり、位置、速度、加速度ベクトル、境界ポリゴン、applyForceや有限状態マシンなどの関数などの基本的なものを提供します

これを行うためのより良いまたはより一般的な方法はありますか?すべての異なるオブジェクトのすべての可能なパラメーターとメソッドを含む1つのキャッチオールクラスのように。(これはさらに混乱するコードを生成すると思います)


これは私の質問に似ています:gamedev.stackexchange.com/questions/22559/…私はそれが与えられた答えを見ることをお勧めします。
Derek

回答:


5

これを行うためのより良いまたはより一般的な方法はありますか?すべての異なるオブジェクトのすべての可能なパラメーターとメソッドを含む1つのキャッチオールクラスのように。

はい、それはアーキテクチャと呼ばれてい。一見持ってここに詳細を。

これにより、ワールドクラスのエンティティのリストが1つだけになります。

List<Entity>

これは、継承より構成の1つの例です。


3

元の質問の範囲内で、1つのオプションは、リストをタイプの代わりにアクションに分割することです。たとえば、List<HasAI>と1がList<Collidable>あり、新しいオブジェクトを作成すると、必要なアクションリストにそれ自体が追加されます。オブジェクトが破棄されると、リストから自分自身が削除されます。オブジェクトは複数のリストに含めることができます。

そのオプションのステップ2は、クラスを階層からインターフェイスを使用するものにリファクタリングすることです。そのため、HasAIタイプは、例としてIBrainsインターフェイスを実装するクラスです。List<HasAI>オブジェクトのみがIBrainsインターフェースを持つことを必要とするマッチング。

これにより、複雑さの一部が解消されます。


2

あなたがする必要があるのは、レンダリングを独自のクラスに抽象化することだと思いますあなたのゲームデザインの。)

ビジターパターンを使用して、レンダラーがさまざまなオブジェクトをループし、何を描画するかを決定できます。


2

基本クラスを使用し、ポリモーフィズムに依存することは非常に良い考えです。しかし、いくつかの代替アプローチがあります。Noel Llopisによる、読む価値のある記事が2つあります。私は最近、データ指向設計を検討しており、いくつかのメリットがあると思います。

記事はここここにあります。それはあなたのコードを多態性よりも少し単純化するかもしれません。しかし、他のYMMVのように、それを見て、それが達成しようとしていることに合っているかどうかを確認してください。ポリモーフィズムは継承を使用し、DODは集約を使用しますが、どちらにも長所と短所があるため、毒を選択します。


1

OOP、特にポリモーフィズムを利用することができます。

基本的に、すべてのゲームエンティティが継承する基本クラスを作成する必要があります。この基本クラスは、できるだけ抽象的であり、作成、更新、そしておそらく破壊関数などが含まれます。

次に、このクラスから他のすべてのゲームオブジェクトを派生させます。言語がサポートしていない場合は、コードに何らかのリフレクションを追加して、さらに高度なことを行う必要がありますが、継承を正しく構造化する方法を知っている場合は、回避できます。


1
彼はすでにこれを行いました-彼のすべてのクラスはGameObjectの子です。彼は一連のリストをゲームオブジェクトの単一のリストに変える必要があるだけです。
SomeGuy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.