Помогите с моим классом гравитации (список проблем) - PullRequest
0 голосов
/ 26 августа 2011

В моем основном классе у меня есть список объектов "Entity", Entity - это класс, который я создал со всеми необходимыми данными, необходимыми для игрока и / или врагов.

List<Entity> Listentities = new List<Entity>();

ДальшеУ меня есть метод Gravity, который в его текущем состоянии имеет некоторые проблемы.

    public void Gravity(GameTime gameTime)
    {
        foreach(Entity entity in Listentities)
        {
            entity.entityPosition.X += 1;
        }
    }

Это очень просто, что я пытаюсь сделать здесь;Я пытаюсь взять каждую сущность в списке и переместить ее позицию. X вниз на одну единицу каждый раз, когда вызывается метод.Однако каждый раз, когда я запускаю игру, я получаю «Ссылка на объект, не установленную для экземпляра объекта» в строке

entity.entityPosition.X += 1;

Мне нужно знать, что я делаю неправильно.Хотя я учусь быстро, я все еще довольно нов.Прямо сейчас, только одна сущность когда-либо добавлена ​​в список, сущность "player1".Я легко могу исправить эту ошибку, набрав

player1.entityPosition.X += 1;

, но это повлияет только на игрока.

Редактировать: я включаю конструктор для Entity:

    public Entity(string entityName, Texture2D EntityAppearance, int EntityMaxHealth, int SpriteHeight, int SpriteWidth, int CurrentFrame, int AnimationCall, int EntityAttack, int EntityStr, int EntityDex, int EntityLuk, int EntityDefense, bool EntityIsMe )
    {
        this.entityName = entityName;
        this.EntityAppearance = EntityAppearance;
        this.EntityMaxHealth = EntityMaxHealth;
        this.SpriteHeight = SpriteHeight;
        this.SpriteWidth = SpriteWidth;
        this.CurrentFrame = CurrentFrame;
        this.AnimationCall = AnimationCall;
        this.EntityAttack = EntityAttack;
        this.EntityLuk = EntityLuk;
        this.EntityDex = EntityDex;
        this.EntityStr = EntityStr;
        this.EntityDefense = EntityDefense;
        this.EntityIsMe = EntityIsMe;
    }

и метод loadcontent () в game1.

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        camera = new Camera(GraphicsDevice.Viewport);
        player1 = new Entity("player1", Content.Load<Texture2D>("PlaceHolder"), 100, 100, 100, 0, 0, 3, 1, 1, 1, 0, true);
        player1.EntityPosition = new Vector2(0, 0);
        player1.EntityBox = new Rectangle((int)player1.EntityPosition.X, (int)player1.EntityPosition.Y, player1.SpriteWidth, player1.SpriteHeight);
        player1.Origin = new Vector2();
        spritefont = Content.Load<SpriteFont>("SpriteFont1");
    }

и переменные entityPosition в верхней части моего класса Entity.

    public Vector2 entityPosition;
    public Vector2 EntityPosition
    {
        get { return entityPosition; }
        set { entityPosition = value; }
    }

Инициализация списка:

    List<Entity> Listentities = new List<Entity>();

это вверху game1.cs

Код, в который я добавляю сущность player1 к Сложностям:

    protected override void Initialize()
    {
        InitGraphicsMode(1280, 720, false);
        Listentities.Add(player1);
        base.Initialize();
    }

в Game1, конечно.

Может быть, я должен был также упомянуть, что я использую XNA GS 4.0

Ответы [ 5 ]

1 голос
/ 26 августа 2011

Возможно, вы не устанавливаете значение объекта entityPosition?

Я бы ожидал, что entityPosition будет Структура Point и, следовательно, не требует инициализации, но, возможно, у вас есть свой собственный класс EntityPosition.

В этом случае

someEntity.entityPosition = new EntityPosition();
0 голосов
/ 26 августа 2011

Пожалуйста, убедитесь, что список действительно инициализирован. Также убедитесь, что вы не добавляете ноль в список.

Ваша EntityPosition является Vector2 (Struct) и поэтому не может быть нулевым. (Это, конечно, при условии, что вы не создали класс и назвали его vector2).

0 голосов
/ 26 августа 2011

Убедитесь, что ваша сущность и entityPosition не равны нулю ...

0 голосов
/ 26 августа 2011

Можете ли вы опубликовать часть, где вы создаете список сущностей? Из сообщения об ошибке видно, что вы не инициализировали список должным образом перед его использованием.

Например, посмотрите на это: http://blogs.msdn.com/b/csharpfaq/archive/2004/05/06/why-do-i-get-the-error-object-reference-not-set-to-an-instance-of-an-object.aspx

Кроме того, для отладки просто сделайте одну вещь - напечатайте Listentities в теле метода Gravity перед циклом foreach.

0 голосов
/ 26 августа 2011

Убедитесь, что каждая сущность создала свое свойство entityPosition, прежде чем пытаться присвоить X. Вероятно, вы забыли добавить new EntityPosition() в один из ваших конструкторов где-то.

...