我有一个“单元”类,它包含我游戏中所有单元将共享的功能和变量。然后我用“士兵”课程扩展了它。 Unit有一个保存基本纹理的静态变量(因为它在创建时对于该类型的所有单位都是相同的,纹理可能随时间而变化)。这些是通过以下方式加载的:
Unit.baseTexture = content.Load<Texture2D>("worker");
Soldier.baseTexture = content.Load<Texture2D>("soldier");
当从“单元”构造函数创建“单元”时,它将使用:
加载纹理this.texture = Unit.baseTexture;
当创建“士兵”时,它将加载它:
this.texture = Soldier.baseTexture;
texture是一个受保护的变量,而不是静态的,因此它应该是每个对象一个。
在主游戏逻辑中,我有一个ArrayList,其中存储了多个Unit和Soldier对象。
当我遍历它们时,我正在做:
foreach (Unit unit in unitList)
{
unit.Draw(spriteBatch);
}
Draw是Unit类的一个函数:
spriteBatch.Draw(this.texture, this.position, Color.White);
但是,这会导致所有单位使用最后加载的纹理绘制(在本例中为士兵纹理)。这让我感到困惑,因为我首先调用了父类,然后是子类。为什么加载士兵纹理也改变了单位纹理,如果绘制的是每个对象的纹理?
答案 0 :(得分: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; }
}
...
}
这样,当构造函数运行时,将使用每种类型单元的右BaseTexture。
答案 1 :(得分:0)
哦,伙计,我是个白痴。我一发布就解决了这个问题。
子类Soldier没有定义自己的baseTexture变量,因此当我使用Soldier.baseTexture加载士兵纹理时,它实际上是使用Unit.baseTexture。
我应该使用接口而不是基类吗?要确保我的所有类都有正确的加载函数和变量?否则,在制作我的子对象时,我必须继续使用“new”来强制它覆盖静态变量。