1

我正在使用 XNA 为 WP7 开发游戏。这是我的结构:

public abstract class enemy
{}

子元素:

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

ETC...

在 WP7 中,很多东西似乎已经被移动和/或删除(尤其是序列化)。尽管进行了很多搜索,但我一直无法找到解决方案。我正在尝试复制子元素。

例如:在加载关卡时,我将三个不同敌人的数组传递到加载阶段。在加载过程中,我需要复制这些敌人中的每一个,这样每个敌人中的 20 个都可以在游戏过程中飞来飞去做自己的事情。

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

4

3 回答 3

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)现在任何具体类型的对象都知道如何克隆自己,所以如果你有一个 Enemies 数组,你可以在每个 Enemies 上调用 Clone() ,它将以正确的方式创建正确的具体类型。

于 2012-04-22T19:00:03.307 回答
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));
}

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

于 2012-04-22T15:52:09.053 回答
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);
   }
}
于 2012-04-23T01:46:56.453 回答