2

ゲーム用の C# ゲーム エンジンを作成していますが、問題が発生しました。

異なるタイプのブロックごとに XNA.Rectangle drawRectangle を実行する必要があります。

ブロックはブロックのリストに格納されるため、多くをキャストせずにドローでアクセスできるようにするには、プロパティをオーバーライドする必要があります。

私はそれを行う多くの方法を試しましたが、どれもうまくいきません。

これが私がやっている現在のものです:

Block.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 の最小限の余分なコード
  • フィールドは静的である必要があります
  • できればオーバーライドする必要はありませdrawRectanglem_drawRectangle
  • プロパティにアクセスするたびに新しい四角形を作成する必要がない
4

4 に答える 4

6

静的メンバーは多態的に呼び出されません - それはそれと同じくらい簡単です。プロパティが静的なままであることについて話していることに注意してください-現時点では静的プロパティはありませんインスタンス プロパティと 2 つの静的フィールドがあります

いくつかのオプション:

  • そのタイプ以外のオブジェクトからの状態を必要としないにもかかわらず、各クラスでオーバーライドされる仮想メンバー
  • 描画する四角形をブロックのコンストラクターに渡し、それをフィールドに格納します
于 2012-06-24T16:57:37.840 に答える
2

virtualキーワードを使用する場合は、各クラスでdrawRectangleをオーバーライドする必要はありません。

Block.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 に答える