2012-02-09 2 views
0

リストに一連のGameObjectを格納しようとしています。何らかの理由で私がリストにオブジェクトを置くたびに、スプライトの参照が失われます(nullになります)。他のすべてのオブジェクトデータ(位置、色など)は、オブジェクト内にそのまま残っているようです。ここで私が試してきたことがあります:Playerオブジェクトがリストに配置されたときにテクスチャを失う

static class Global 
{ 
     public static List<GameObject> objects = new List<GameObject>(); 
} 

これは私が使っているリストです。今、問題のオブジェクトのために - プレイヤー:私のメインのXNAクラス(重要なスニペット)で

class Player : GameObject 
{ 
    public Vector2 position = Vector2.Zero; 
    public Texture2D sprite; 
    public Color image_blend = Color.White; 

    public Player() : base() 
    { 
     //nothing here, nothing in base class either 
    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     spriteBatch.Draw(sprite, position, image_blend); 
    } 
} 

そして最後に:

protected override void LoadContent() 
    { 
     spriteBatch = new SpriteBatch(GraphicsDevice); 
     sprPlayer = Content.Load<Texture2D>("player"); 

     player = new Player(); 
     player.sprite = sprPlayer; 
     Global.objects.Add(player); 
    } 

    protected override void Draw(GameTime gameTime) 
    { 
     GraphicsDevice.Clear(Color.Black); 

     spriteBatch.Begin(); 
     for (int i = 0; i < Global.objects.Count; i++) 
     { 
      Global.objects[i].Draw(spriteBatch); 

     } 
     spriteBatch.End(); 

     base.Draw(gameTime); 
    } 

私はこのことについて間違った道を進んですることができる感覚を持っています。どんな助けもありがとうございます。

答えて

0

PlayerにはGameObjectクラス(コードを投稿していない)ではなく、「スプライト」というTexture2Dメンバーがあります。

Playerクラスを作成するときに、そのメンバーにTexture2Dを割り当ててから、Playerを親GameObjectとして保存すると、特定のオブジェクトタイプメンバーにアクセスできなくなります。

修正するには、基本GameObjectにメンバー "sprite"を設定し、GameObjectから継承しているPlayerクラスでonを使用しないようにします。

+0

問題が見つかりました。私は 'GameObject'に' Draw'メソッドと 'Update'メソッドを' virtual'と宣言していなかったので、Playerクラスによって正しくオーバーライドされていませんでした。ご協力いただきありがとうございます! –

0

あなたのリストobjectsGameObjectです。私はあなたのplayerオブジェクト内のGameObjectクラスの一部ではないデータがすべて破棄されていると推測しています。私は確信が持てません。

また、スプライトのテクスチャについては、別のアプローチをとるべきです。あなたが選手や敵のエンティティの束を追加することを決めた場合、それらのエンティティはそれぞれ独自のテクスチャを持ちます。 100人を追加することに決めたら、同じテクスチャの複製が100個あります。

まず、テクスチャをテクスチャの配列に読み込むことをお勧めします。

//Please excuse my bugs, I haven't used c# in a while 
//Place this in your global class: 
public static Texture2D[] myTextures = new Texture2D[1]; //or more if you decide to load more. 
//And place this in your LoadContent() Method: 
Global.myTextures[0] = Content.Load<Texture2D>("player"); 
//Also, modify your player class: 
public int textureIndex = 0; 

public void Draw(SpriteBatch spriteBatch) 
{ 
    spriteBatch.Draw(Global.myTextures[textureIndex], position, image_blend); 
} 

各プレーヤーオブジェクトの代わりに、独自のテクスチャを持つ代わりに、配列のテクスチャを使用します。今度は、エンティティごとに不必要な重複テクスチャなしで多くのエンティティを持つことができます

+0

ご協力ありがとうございます。 'GameObject'クラスは' Player'クラスによって正しく上書きされるために 'virtual'として宣言された関数を必要としていました。私は間違いなくテクスチャのためのあなたのメソッドを使用するつもりです。私は彼らが各オブジェクトによってコピーされることを知らなかった。 –

+0

これらのオブジェクトは各オブジェクトによってコピーされません。Content.Load ()は常に、呼び出されるたびに新しいコピーではなく、同じオブジェクトインスタンスを返します。 MSDNのContenManager.Load()の定義を参照してください。http://msdn.microsoft.com/en-us/library/bb197848.aspx – hatboyzero

関連する問題