4

インスタンス変数からクラスの静的メソッド/変数にアクセスする方法はありますか?答えを検索しようとしましたが、静的メソッド内のインスタンスメソッド/変数にアクセスできない理由しか見つかりません。staticがインスタンスにアクセスできない理由はわかりますが、インスタンスがstaticにアクセスできない理由はわかりません。

私の状況は次のとおりです。私はXNAでトップダウンのシューティングゲームを作成している学生であり、各ゲームオブジェクトに静的なTexture2Dを使用しようとしています。他のすべてのクラスの基本を設定するGameObjectクラスがあり、ボットと発射体の基本をそれぞれ設定する他の2つのメインクラス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の1つの配列が必要な理由は、どこにでもコードを追加しなくても、別の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;

あなたはtexturedataのものについても同じことをすることができます

編集:ところで、テクスチャがある場合は、Color [] TextureDataを抽出できるので、静的なものとして保持する必要があります

于 2012-11-21T22:33:15.623 に答える