播放器对象放置在列表上时会丢失纹理
本文关键字:纹理 列表 对象 播放器 | 更新日期: 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。
您的列表objects
是GameObject
列表。我猜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);
}
现在,不是每个玩家对象都有自己单独的纹理,而是使用数组中的纹理。现在你可以有很多实体,而每个实体都没有不必要的重复纹理