放置在List上时,Player对象会丢失纹理

时间:2012-02-09 03:07:57

标签: c# .net xna xna-4.0

我正在尝试在List上存储一系列GameObjects。出于某种原因,无论何时我将一个对象放在列表中,它都会丢失它的精灵引用(变为null)。所有其他对象数据(位置,颜色等)似乎都保留在对象中。这是我一直在尝试的:

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

这是我正在使用的列表。现在对于有问题的对象 - 玩家:

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);
    }
}

最后在我的主要XNA课程中(重要的片段):

    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);
    }

我有一种感觉,我可能会采取错误的方式。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

Player有一个名为“sprite”的Texture2D成员而不是你的GameObject类(你没有发布代码)。

因此,当您创建Player类时,将其成员分配给Texture2D,然后将Player存储为其父GameObject,使其所有特定的对象类型都无法访问。

要修复,你需要让你的基础GameObject拥有成员“sprite”,而不是你的Player类继承自GameObject。

答案 1 :(得分: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);
}

现在,不是每个玩家对象拥有自己独立的纹理,而是使用数组中的纹理。现在,您可以拥有大量实体,而不会为每个实体添加不必要的重复纹理