2012-04-22 59 views
1

我正在使用XNA开发WP7游戏。这里是我的结构:如何在WP7中克隆抽象类的孩子XNA

public abstract class enemy 
{} 

子元素:

public class genericEnemy : enemy{} 
... 
public class snake : enemy {} 

等等

在WP7,很多事情都是围绕移动和/或删除(尤其是序列化)它似乎。尽管搜索很多,但我一直无法找到解决方案。我试图复制子元素。

例如:在加载关卡时,我会将三个不同敌人的阵列传递到加载阶段。在装载过程中,我需要复制每个敌人,以便在游戏过程中每个敌人都有20个围绕自己的事情飞行。

我见过的所有解决方案都是指WP7库中没有的东西。

+0

是不是你有可能访问他们的公共属性和直接复制呢?或者,您是否可以编辑类定义来添加.Clone()方法? (你是什么意思的子元素?) – neeKo 2012-04-22 15:29:05

回答

0

创建一个敌人工厂,可以从某种id创建敌人。在加载你的水平,你可以调用出厂的时候,你需要创建一个敌人:

class EnemyFactory 
{ 
Enemy CreateEnemy(int id) 
{ 
    if (id == 0) 
    return new Snake(); 
    return new GenericEnemy(); 
} 

} 


void LoadLevel() 
{ 
// bla bla 
Level level = new Level(); 
int enemyId = LoadFromFile(); 
level.AddEnemy(EnemyFactory.CreateEnemy(enemyId)); 
} 

这样你摆脱讨厌的克隆代码,并可以控制在工厂类中的所有敌人的实例。

+0

我最初构造我的代码这样,但希望有一个更简单的路线。经过研究,这似乎是完成我所做的最简单的方法。 – julio9 2012-04-22 20:25:18

2

就我所知,没有“图书馆”这样做的方式。一种解决方案是:

1)在敌人中声明一个克隆()方法,该方法返回该敌人的副本。

abstract class Enemy { 
    public abstract Enemy Clone(); 
} 

2)执行它在每一个具体类型,因此一个蛇创建一个新蛇等。示例:

class Snake : Enemy { 
    int speed; 
    public override void Enemy Clone() { 
     var clone = new Snake(); 
     clone.speed = speed; 
     return clone; 
    } 
} 

3)现在具体类型的任何对象都知道如何克隆本身所以如果你有一群敌人,你可以在每一个上调用Clone(),它会以适当的方式创建适当的具体类型。

0

使用调用拷贝构造函数的抽象方法:

public abstract class Enemy 
{ 
    private readonly int mEnemyData; 

    protected Enemy(Enemy pEnemy) 
    { 
     mEnemyData = pEnemy.mEnemyData; 
    } 

    public abstract Enemy Clone(); 
} 

public sealed class GenericEnemy : Enemy 
{ 
    private readonly double mGenericEnemyData; 

    private GenericEnemy(GenericEnemy pGenericEnemy) 
    : base(pGenericEnemy) 
    { 
     mGenericEnemyData = pGenericEnemy.mGenericEnemyData; 
    } 

    public override Enemy Clone() 
    { 
     return new GenericEnemy(this); 
    } 
}