0

C# (XNA) でゲームを作成していますが、その方法がわかりません。これは、私が行っていることの非常に単純化されたバージョンです。

class GameObject
{
    Protected Sprite mSprite;
    Protected string filename;

    public LoadContent(ContentManager theContentManager)//XNA forces you to load content through a Content Manager which belongs to the main game class
    {
    mSprite.Load(theContentManager, filename);//the Sprite class contains a texture and methods to deal with loading images, animating, etc
    }
}

class SomeObject : GameObject
{
    public SomeObject()
    {
    filename = "someobject.png";
    }
}

「SomeObject」の各インスタンスには同じスプライトがあり、「SomeObject」が開始された後、継承された loadContent メソッドによってロードされます。通常、LoadContent メソッドはゲームの開始時に 1 回だけ呼び出されます。

ただし、ゲームの実行中に新しいオブジェクトを追加できるようにしたいと考えています。「SomeObject」の各インスタンスが同じスプライトを共有できるようにして、新しいインスタンスが同じ画像を再度ロードする必要がないようにするとよいでしょう。現在、既存のオブジェクトからスプライトをコピーするだけです。たとえば someObject2.mSprite = someObject1.mSprite 、これは、コピー元のクラスの既存のインスタンスがある場合にのみ機能します。私がやりたいのは mSprite を静的にすることですが、基本クラスで静的として宣言すると、他のすべてのオブジェクトが同じスプライトを取得し、派生クラスで宣言すると、方法がわかりませんload メソッドをすべてのクラスに書き直さずに画像をロードします。これを行う方法はありますか?

4

2 に答える 2

3

protected abstract基本クラスでプロパティを作成できます。

各派生クラスは、スプライトを静的フィールドに格納し、オーバーライドされたプロパティから返すことができます。

于 2012-06-13T22:33:44.847 に答える
0

このスイートのようなものはあなたのニーズですか? すべてのゲーム オブジェクトが使用できるスプライトのコレクションを作成しました。作成済みのスプライトと同じ名前のスプライトを指定すると、読み込まれたスプライトへの参照が使用されます。新しい名前の場合は、新しいスプライトが読み込まれます。

public class GameObject
{
    protected static Dictionary<string, Sprite> sprites = new Dictionary<string, Sprite>();

    protected string fileName;
    protected Sprite sprite;

    public void LoadContent(ContentManager contentManager)
    {
        lock (sprites)
        {
            if (sprites.ContainsKey(fileName))
                sprite = sprites[fileName];
            else
                sprites.Add(fileName, mSprite.Load(theContentManager, filename));
        }
    }

    public GameObject(string fileName)
    {
        this.fileName = fileName;
    }
}
于 2012-06-15T10:24:36.957 に答える