2

我正在为我的游戏编写 C# 游戏引擎,但遇到了问题。

我需要为每种不同类型的块做一个 XNA.Rectangle drawRectangle。

块存储在块列表中,因此必须覆盖该属性,以便通过绘制访问而无需大量转换。

我已经尝试了很多方法,但都没有奏效。

这是我正在做的当前一个:

块.cs

protected static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32);
public Rectangle drawRectangle
{
    get { return m_drawRectangle; }
}

BlockX.cs

protected static Rectangle m_drawRectangle = new Rectangle(32, 0, 32, 32);

但是,在创建 BlockX 并访问 时drawRectangle,它仍然返回 0、0、32、32。

理想情况下,我可以只覆盖该drawRectangle成员,但是这样做意味着在每个块类中创建一个成员。我只想调整 m_drawRectangle。

每个块将被创建数百次,所以我不希望它是非静态的,在构造函数中这样做会很愚蠢。

除了在每个块中放置一个静态函数来初始化静态事物之外,还有什么更好的方法吗?

编辑:

所以总结一下,我的要求是:

  • BlockX.cs 中需要覆盖的最少额外代码
  • 字段必须保持静态
  • 最好不用覆盖drawRectangle,只有m_drawRectangle
  • 每次访问属性时都不必创建新的矩形
4

4 回答 4

6

静态成员不是以多态方式调用的——就这么简单。请注意,您谈论的是保持静态的属性-您目前没有静态属性。您有一个实例属性和两个静态字段

几个选项:

  • 一个在每个类中被覆盖的虚拟成员,即使它不需要对象的任何状态,除了它的类型
  • 将要绘制的矩形传递到块的构造函数中,并将其存储在一个字段中
于 2012-06-24T16:57:37.840 回答
2

如果您使用 virtual 关键字,则不必在每个类中覆盖 drawRectangle。

块.cs

protected static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32);
public virtual Rectangle drawRectangle
{
    get { return m_drawRectangle; }
}

BlockX.cs

private static Rectangle m_drawRectangleX = new Rectangle(32, 0, 32, 32);
public override Rectangle drawRectangle
{
    get { return m_drawRectangleX; }
}
于 2012-06-24T17:02:35.417 回答
1

您不能覆盖静态成员。

我意识到您不想覆盖drawRectangle,但考虑到您的问题,这似乎是最简单的实现解决方案。您最好的解决方案是在每个派生类中声明一个新的静态字段并覆盖实例属性以达到您想要的结果:

public class Block
{
    private static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32);
    public virtual Rectangle drawRectangle
    {
        get { return m_drawRectangle; }
    }
}

public class BlockX : Block 
{
    private static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32);
    public override Rectangle drawRectangle
    {
        get { return m_drawRectangle; }
    }
}
于 2012-06-24T17:01:14.147 回答
0

正如其他人提到的那样,您不能覆盖静态成员,但我想即兴回答,同时考虑到静态成员创建期间或由于应用程序池回收或类似事件可能出现的任何问题。

public class Block
{
    private static Rectangle m_drawRectangle;
    public virtual Rectangle drawRectangle
    {
        get 
            {
                 if(m_drawRectangle == null) m_drawRectangle = new Rectangle(0, 0, 32, 32); 
                 return m_drawRectangle; 
            }
    }
}

public class BlockX : Block 
{
    private static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32);
    public override Rectangle drawRectangle
    {
        get 
            {
                 if(m_drawRectangle == null) m_drawRectangle = new Rectangle(0, 0, 32, 32); 
                 return m_drawRectangle; 
            }

    }
}
于 2016-07-16T20:46:25.747 回答