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 をまったく持たないようにしながら、これを行うための最も明確で最もメモリ効率の良い方法を探しています。
どんな提案でも大歓迎です!
ありがとう!