所以我想从敌人列表中随机产生一个敌人,但我找不到一个干净的方法来从列表中的敌人实例创建一个新的Enemy实例。这主要是因为我完全有不同对象类型(Enemy类型的子类)的敌人,所以我不能简单地复制所有属性。 例如:
List<Enemy> EnemyDB = new List<Enemy>();
EnemyDB.Add(new Enemy(150,1.8f,"grunt"));
EnemyDB.Add(new EnemyOther(60, 5.8f, "bug"));
Enemy template = EnemyDB.[get random enemy];
Enemy toBeSpawned = ????;
如何获得列表敌人的新实例?还有更好的办法吗?
答案 0 :(得分:3)
尝试在每个Enemy子类型上创建“克隆”方法,并在您从列表中随机选择的方法上调用该方法。你也可以去“轻量级”;创建一个较浅的副本,简单地引用Enemy的更昂贵的成员,如图形元素(精灵,纹理,骨架),而不是制作多个内存中的副本。
答案 1 :(得分:1)
更改敌人的定义以实施ICloneable界面,或使用Object.MemberwiseClone方法。
另请参阅Creating a copy of an object in C#和How do you do a deep copy of an object in .NET (C# specifically)?
答案 2 :(得分:0)
至少在概念上,您需要区分敌人(咕噜声,错误,......)和敌人实例的类。该类定义了敌人的初始生命值/生命值,而实例则表示实际生成的具有个人统计数据和位置的敌人。
有两种方法可以对此进行建模。
班级/实例模型
你创造了两个类:一个用于敌人类,一个用于敌人实例。对于EnemyClass
个实例,Enemy
是factory。
class EnemyClass
{
public string Name { get; }
public int InitialHealth { get; }
public Enemy Spawn();
}
class Enemy
{
public EnemyClass Class { get; }
public int CurrentHealth { get; }
public Vector2D Position { get; }
}
// define enemy classes
EnemyClass gruntClass = new EnemyClass(...);
EnemyClass bugClass = new EnemyClass(...);
// spawn an enemy
Enemy enemy = gruntClass.Spawn();
原型模型
只有一个班级Enemy
。对于每个敌人类,该类的敌人实例都有prototype。这个原型在游戏中不存在。为了产生敌人,你可以复制原型。
class Enemy
{
public string Name { get; }
public int InitialHealth { get; }
public int CurrentHealth { get; }
public Vector2D Position { get; }
public Enemy Clone();
}
// define enemy prototypes
Enemy gruntPrototype = new Enemy(...);
Enemy bugPrototype = new Enemy(...);
// spawn an enemy
Enemy enemy = gruntPrototype.Clone();