3

Xna/C# で基本的なゲームと 2D エンジンに取り組んでおり、いくつかのことを単純化しようとしています。エンジンからの Entity2D の基本クラスと、それを継承するゲーム固有の 2 つのクラス (Tower と Enemy) があります。私のエンジンでは、Towers 用と Enemies 用の 2 つの個別のリストを作成するのではなく、それらを 1 つの汎用リストに結合したいと考えています。次に、リストからタワーを返す必要があるか、リストから敵を返す必要があるかという問題があります。エンジン オブジェクトから型キャストを使用できることはわかっています。

class Entity2D {...} //engine object
class Tower : Entity2D {...} //game specific
class Enemy : Entity2D {...} //game specific

//In engine:
public Entity2D GetEntity(int index) { ...return objects[index];}

//Somewhere in the game
{
    Enemy e = GetEntity(0) as Enemy;
    if(e != null)
        //Enemy returned

    Tower t = GetEntity(0) as Tower;
    if(t != null)
        //Tower returned
}

もちろん、これは非常に効率が悪いようです。

私もisキーワードを少し調べましたが、次のように機能するようです:

Entity2D entity = GetEntity(0);
if(entity is Tower)
{
    Tower t = (Tower)entity;
    t.DoTowerThings();
}

それでも、基本オブジェクトを返し、さらに多くのメモリを使用して 2 番目のオブジェクトを作成し、それに型キャストすることになります。

このようなことを行う方法があれば、本当にいいことです:

//In engine:
public T GetEntity(int index) 
{ 
    if(T == Tower) //or however this would work: (T is Tower), (T as Tower), etc
        return objects[index] as Tower;
    else if(T == Enemy) 
        return objects[index] as Enemy;
    else return null;
}

Enemy e = GetEntity(0);

しかし、それはエンジンとゲームを分離するエンジン部分を壊します

私は、Entity2D をエンジンベースにし、エンジンに Tower や Enemy をまったく持たないようにしながら、これを行うための最も明確で最もメモリ効率の良い方法を探しています。

どんな提案でも大歓迎です!

ありがとう!

4

3 に答える 3

0

戻り値を明確にする必要がある場合は、コードの構造が悪く、オブジェクトが論理的に類似していないため、型ごとに別々のアクセサーを持つ 2 つのリストを作成する方がよいでしょう。

ただし、タイプが非常に似ていて、あいまいさをほとんど解消する必要がない場合は、次のようにします。

abstract class GameEntity : Entity2D
{
  abstract public void TowerOnlyFunction (args); // need to look up exact syntax, but you get the idea
  abstract public void EnemyOnlyFunction (args);

  void CommonFunctions (args);
}

class Tower : GameEntity
{
  public void TowerOnlyFunction (args)
  {
    // code
  }
  public void EnemyOnlyFunction (args)
  {
    // empty
  }
}

class Enemy : GameEntity
{
  public void TowerOnlyFunction (args)
  {
    // empty
  }
  public void EnemyOnlyFunction (args)
  {
    // code
  }
}

//Somewhere in the game
void DoSomethingWithTower ()
{
  GameEntity e = GetEntity(0);
  e.TowerOnlyFunction ();
}
于 2013-06-23T19:55:58.280 に答える