2013-01-06 205 views
1

我有一个类“单位”,它拥有我游戏中所有单位共享的函数和变量。然后我用一个“士兵”班扩展它。单位有一个静态变量,用于保存基本纹理(因为创建时该类型的所有单位都是相同的,纹理可能随时间而改变)。子类覆盖父类变量?

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

当从“单元”构造函数创建一个“单元”,它会加载与所述纹理:这是由加载在创建“士兵”

this.texture = Unit.baseTexture; 

,它将加载它是这样的:

this.texture = Soldier.baseTexture; 

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

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

当我通过他们循环,我做的:

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

平局是在股类中的函数:

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

然而,这导致所有单位最后加载的画纹理(在这种情况下,士兵纹理)。这让我感到困惑,因为我先调用父类,然后调用子类。为什么加载Soldier纹理也改变了Unit纹理,如果绘制的是每个对象的纹理?

回答

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将被使用。

+0

你能详细说明一下吗?我是csharp的新手,没有听说过术语属性。 – MatthewMcGovern

+0

添加了一个示例。 – JLRishe

+0

啊,非常感谢你。这很有道理! – MatthewMcGovern

0

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

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

我应该使用接口而不是基类吗?为了确保我所有的类都有正确的加载函数和变量?否则,当使我的子对象强制重写一个静态变量时,我必须继续使用“新”。

+3

责备它缺乏咖啡。 ;) – OnoSendai

+0

jsut然后删除。 – Nahum