Объект игрока теряет текстуру при помещении в список - PullRequest
0 голосов
/ 09 февраля 2012

Я пытаюсь сохранить серию объектов GameObject в списке. По какой-то причине каждый раз, когда я помещаю объект в список, он теряет ссылку на спрайт (становится нулевым). Все остальные данные объекта (позиция, цвет и т. Д.), Похоже, остаются в объекте просто отлично. Вот что я пытался:

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 голосов
/ 09 февраля 2012

Ваш список 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);
}

Теперь вместо каждого объекта игрока, имеющего свою собственную отдельную текстуру, он использует текстуру из массива. Теперь вы можете иметь много сущностей без ненужных дубликатов текстур для каждой сущности

0 голосов
/ 09 февраля 2012

У игрока есть член Texture2D под названием "sprite", а не класс GameObject (для которого вы не опубликовали код).

Поэтому, когда вы создаете класс Player, вы назначаете его члену Texture2D, а затем сохраняете Player как родительский объект GameObject, делая все его элементы определенного типа объектов недоступными.

Чтобы исправить, вам нужно, чтобы ваш базовый GameObject имел элемент "sprite", а не включенный в вашем классе Player, который наследуется от GameObject.

...