1

我有一个“单元”类,它包含我游戏中所有单元将共享的函数和变量。然后我用“士兵”类扩展了它。单元有一个静态变量来保存基础纹理(因为创建时该类型的所有单元都是相同的,纹理可能会随着时间而改变)。这些是通过以下方式加载的:

Unit.baseTexture = content.Load<Texture2D>("worker");
Soldier.baseTexture = content.Load<Texture2D>("soldier");

当从“Unit”构造函数创建“Unit”时,它将加载纹理:

this.texture = Unit.baseTexture;

创建“士兵”时,它将像这样加载它:

this.texture = Soldier.baseTexture;

纹理是一个受保护的变量,不是静态的,所以它应该是每个对象一个。

在主游戏逻辑中,我有一个 ArrayList,其中存储了多个 Unit 和 Soldier 对象。

当我遍历它们时,我正在做:

foreach (Unit unit in unitList)
{
    unit.Draw(spriteBatch);
}

Draw 是 Unit 类的一个函数:

spriteBatch.Draw(this.texture, this.position, Color.White);

但是,这会导致所有单位都使用最后加载的纹理(在本例中为士兵纹理)进行绘制。这让我感到困惑,因为我先调用父类,然后是子类。如果绘制的是每个对象的纹理,为什么加载士兵纹理也会改变单位纹理?

4

2 回答 2

1

我认为正确的做法是使用 BaseTexture 的属性,然后您可以根据需要使用override关键字覆盖它。new应避免使用关键字来隐藏成员。

例如:

class Unit
{
   private static Texture2D s_unitTexture = content.Load<Texture2D>("worker");
   protected virtual Texture2D BaseTexture
   {
      get { return s_unitTexture; }
   }

   public Texture2D Texture { get; set; }

   public Unit()
   {
       this.Texture = BaseTexture;
   }

   ...
}

class Soldier : Unit
{
   private static Texture2D s_soldierTexture = content.Load<Texture2D>("soldier");
   protected override Texture2D BaseTexture
   {
      get { return s_soldierTexture; }
   }

   ...
}

这样,当构造函数运行时,将使用每种 Unit 类型的正确 BaseTexture。

于 2013-01-06T13:33:27.097 回答
0

哦,伙计,我是个白痴。我一发布就解决了这个问题。

子类 Soldier 没有定义自己的 baseTexture 变量,所以当我使用 Soldier.baseTexture 加载士兵纹理时,它实际上是在使用 Unit.baseTexture。

我应该使用接口而不是基类吗?确保我所有的类都有正确的加载函数和变量?否则,在使我的子对象强制它覆盖静态变量时,我必须继续使用“new”。

于 2013-01-06T13:12:06.650 回答