4

有没有办法从实例变量访问类的静态方法/变量?我试过寻找答案,但我的搜索只找到了为什么你不能在静态方法中访问实例方法/变量。我明白为什么静态无法访问实例,但我不明白实例无法访问静态。

这是我的情况:我是一名在 XNA 中制作自上而下的射击游戏的学生,我正在尝试为每个游戏对象使用静态 Texture2D。我有一个 GameObject 类,它为所有其他类奠定了基础,另外两个主要类 GameBot 和 Projectile 分别为机器人和射弹奠定了基础。我的问题也与这种继承有关。我在 GameBot 和 Projectile 类中拥有所有碰撞代码,其他类(如 PlayerShip/EnemyShip 或 Cannonball/Missile)继承自它们。

我遇到的问题是我想从一个我不知道该类的实例变量中访问一个类方法/变量。我的意思是,我将我的方法传递给 GameBot 变量,但它可以是 PlayerShip、EnemyShip 或 GameBot 的任何其他子项,并且每个都有不同的静态纹理数据。

class GameBot : GameObject
{
    static protected Texture2D texture;
    static internal Color[] textureData;

    //etc...

    internal bool DidHitEnemy(GameBot enemyGameBot)
    {
        //Here, I want to access enemyGameBot.textureData
        //to do pixel-by-pixel collision
        //but A) enemyGameBot.textureData doesn't work
        //and B) enemyGameBot's class could be any child of GameBot
        //so I can't just use GameBot.textureData
    }

    static internal virtual Color[] GetTextureData()
    {
        return textureData;
        //I even thought about coding this function in each child
        //but I can't access it anyway
    }
}

这个游戏是一种继承的练习。我想尝试在层次结构中较高的类中保留尽可能多的代码,并且只对每个类中的本质区别进行编码。我决定使用静态纹理的原因是我可以在每个 GameBot 中保留一个 Projectile 数组,但能够即时修改该数组中某个位置的 Projectile(Cannonball、Missile 等)。如果没有静态射弹,我每次切换射弹时都必须分配精灵。我想要一个 Projectile 数组的原因是我可以轻松添加另一个 Projectile,而无需在任何地方添加代码。

有没有办法从实例变量访问静态方法/变量?如果没有,有什么建议可以让碰撞代码尽可能通用吗?

4

2 回答 2

6

从实例访问它的一种简单方法是这样的......

public Color[] GetTextureData()
{        
    //note that `GameBot.` isn't required but I find it helpful to locate static 
    //calls versus `this.` for instance methods
    return GameBot.GetTextureDataInternal(); 
}

static internal Color[] GetTextureDataInternal()
{
    return textureData;
}

...然后您可以.GetTextureData()从外部变量中调用,而不必单独管理/维护静态调用。

于 2012-11-21T22:04:01.433 回答
0
    class Gamebot : GameObject
{
    static Texture2D DefaultTexture;
    public virtual Texture2D Texture {get{return Gamebot.DefaultTexture;}}



    //etc...

    internal bool DidHitEnemy(Gamebot enemyGameBot)
    {

      //  enemyGameBot.Texture; // this will give you the texture of the enemyGameBot 
    }


}
class SmartBot : Gamebot
{
    static new Texture2D DefaultTexture;
    public override Texture2D Texture { get { return SmartBot.DefaultTexture; } }

}

在 LoadContent 中,您将分配每个类的纹理

SmartBot.DefaultTexture = null;
GameBot.DefaultTexture =null;

你可以对纹理数据做同样的事情

编辑:顺便说一句,如果你有你的纹理,你可以提取 Color[] TextureData 所以你需要将它保持为静态

于 2012-11-21T22:33:15.623 回答