1

所以我想从敌人列表中随机生成一个敌人,但是我找不到从列表中的 Enemy 实例创建一个新的 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 = ????;

如何获得列表敌人的新实例?有没有更好的方法完全做到这一点?

4

3 回答 3

3

尝试在每个 Enemy 子类型上创建一个“克隆”方法,然后在您从列表中随机选择的那个上调用该方法。你也可以去“蝇量级”;创建一个简单地引用 Enemy 更昂贵的成员的较浅副本,例如图形元素(精灵、纹理、骨架),而不是在内存中制作多个副本。

于 2012-11-10T21:37:51.347 回答
1

更改敌人的定义以实现ICloneable接口,或使用Object.MemberwiseClone方法。

另请参阅在 C# 中创建对象的副本以及如何在 .NET(特别是 C#)中对对象进行深层复制?

于 2012-11-10T21:42:39.360 回答
0

至少在概念上,您需要区分敌人类别(咕噜声、虫子等)和敌人实例。该类定义了一个敌人的初始生命值/生命值,而一个实例代表了一个实际生成的具有个人统计数据和位置的敌人。

有两个选项可以对此进行建模。

类/实例模型

您创建了两个类:一个用于敌人类,一个用于敌人实例。这EnemyClass是实例的工厂Enemy

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。对于每个敌人类,都有该类的敌人实例的原型。这个原型在游戏中不存在。要生成敌人,您需要复制原型。

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();
于 2012-11-10T21:48:36.623 回答