从列表中创建敌人

时间:2012-11-10 21:31:55

标签: c# list xna copy

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

如何获得列表敌人的新实例?还有更好的办法吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

答案 2 :(得分:0)

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

有两种方法可以对此进行建模。

班级/实例模型

你创造了两个类:一个用于敌人类,一个用于敌人实例。对于EnemyClass个实例,Enemyfactory

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();