我正在使用XNA为WP7开发游戏。这是我的结构:
public abstract class enemy
{}
子元素:
public class genericEnemy : enemy{}
...
public class snake : enemy {}
等...
在WP7中,很多东西已被移动和/或移除(特别是使用序列化)。尽管经常进行搜索,我还是找不到解决方案。我正在尝试复制子元素。
例如:在加载关卡时,我将三个不同敌人的数组传递到加载阶段。在加载过程中,我需要复制每个敌人,这样每个敌人中的20个都会在游戏过程中自行飞行。
我见过的所有解决方案都涉及WP7库中不存在的内容。
答案 0 :(得分:2)
据我所知,没有“图书馆”这样做的方法。一种解决方案是:
1)在敌人中声明一个Clone()方法,返回该敌人的副本。
abstract class Enemy {
public abstract Enemy Clone();
}
2)在每种具体类型中实现它,因此Snake会创建一个新的Snake等。例如:
class Snake : Enemy {
int speed;
public override void Enemy Clone() {
var clone = new Snake();
clone.speed = speed;
return clone;
}
}
3)现在任何具体类型的对象都知道如何克隆自己,所以如果你有一个敌人数组,你可以在每个上调用Clone(),它将以正确的方式创建适当的具体类型。
答案 1 :(得分: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));
}
通过这种方式,您可以摆脱讨厌的克隆代码,并且可以控制工厂类中的所有敌人实例化。
答案 2 :(得分: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);
}
}