我正在尝试在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);
}
我有一种感觉,我可能会采取错误的方式。任何帮助表示赞赏。
答案 0 :(得分:0)
Player有一个名为“sprite”的Texture2D成员而不是你的GameObject类(你没有发布代码)。
因此,当您创建Player类时,将其成员分配给Texture2D,然后将Player存储为其父GameObject,使其所有特定的对象类型都无法访问。
要修复,你需要让你的基础GameObject拥有成员“sprite”,而不是你的Player类继承自GameObject。
答案 1 :(得分:0)
您的列表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);
}
现在,不是每个玩家对象拥有自己独立的纹理,而是使用数组中的纹理。现在,您可以拥有大量实体,而不会为每个实体添加不必要的重复纹理