播放器对象放置在列表上时会丢失纹理

本文关键字:纹理 列表 对象 播放器 | 更新日期: 2023-09-27 18:23:55

我正在尝试将一系列游戏对象存储在列表中。由于某种原因,每当我把一个对象放在列表上时,它就会丢失它的sprite引用(变成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);
    }

我有一种感觉,我可能走错了路。感谢您的帮助。

播放器对象放置在列表上时会丢失纹理

Player有一个名为"sprite"的Texture2D成员,而不是您的GameObject类(您没有发布其代码)。

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

要修复此问题,您需要使您的基础GameObject具有成员"sprite",而不是在您的Player类中继承自GameObject。

您的列表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);
}

现在,不是每个玩家对象都有自己单独的纹理,而是使用数组中的纹理。现在你可以有很多实体,而每个实体都没有不必要的重复纹理