Не могу присвоить новое значение перечисления переменной - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть перечисление, определенное следующим образом:

 public enum Direction
{
    Left,
    Right,
    Up,
    Down
}

И у меня следующая переменная в классе:

private Direction direction;

В конструкторе я назначаю переменную:

direction = Direction.Right;

Затем, в методе того же класса, я пытаюсь присвоить новое значение Enum:

direction = Direction.Down;

Но это не позволит мне!Он продолжает возвращаться к правильному значению, даже если единственное место, где он установлен, находится в конструкторе!

Что происходит?o_O

РЕДАКТИРОВАТЬ - БОЛЬШЕ КОДА

    namespace MyFirstGame
{
    public enum Direction
    {
        Left,
        Right,
        Up,
        Down
    }
}

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace MyFirstGame
{
    public class Invader : Sprite, IMovable
    {
        private InvaderType invaderType { get; set; }
        private Direction direction;
        private Vector2 speed;

        public Invader(Texture2D image, Vector2 position)
            : base(image, position, new Point(30, 16), new Point(0, 0), new Point(2, 0))
        {
            direction = Direction.Right;
            speed.X += 30;
        }

        public override void Update(GameTime gameTime, Rectangle clientBounds)
        {
            timeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;

            if (timeSinceLastFrame > milliSecondsPerFrame)
            {
                timeSinceLastFrame -= milliSecondsPerFrame;

                ++currentFrame.X;

                if (currentFrame.X >= SheetSize.X)
                {
                    currentFrame.X = 0;
                }

                Move(direction, clientBounds);
            }
        }

        public void Move(Direction direction, Rectangle clientBounds)
        {
            if (direction == Direction.Right)
            {
                //is invader 3 px from the right edge?
                //if yes: then drop
                //else keep on truckin' to the right!
                if (position.X >= (clientBounds.Width - (Image.Width + 3)))
                {
                    //position.X = 0;
                    position.Y += speed.X;

                    direction = Direction.Down;
                }
                else
                {
                    position.X += speed.X; //Speed
                }
            }
            else if (direction == Direction.Down)
            {
                speed.X *= -1;
                position.X += speed.X;
            }
        }
    }
}

Метод

Ответы [ 2 ]

0 голосов
/ 24 февраля 2011

Да, я отвечаю на свой вопрос: -)

А почему это не сработало? Я знаю, с одной стороны, почему, а с другой - нет.

Часть, которую я знаю:

У меня был вызов этого метода в моем методе Update ():

Move (direction, clientBounds);

Но дело в том, что Enums являются структурами. Параметр в методе Move (direction, clientBounds) фактически копируется! Любые изменения, происходящие внутри метода, не влияют на исходное значение переменной. Поэтому в любое время я получал исходное значение при выходе из метода Move ().

То, на что я не могу положиться прямо сейчас, это тот факт, что я удалил направление как параметр из вызова метода Move, и теперь я назначаю новое направление непосредственно переменной уровня класса private direction Direction; . Кажется, это работает отлично :-) Но почему?

0 голосов
/ 23 февраля 2011

Предполагая, что у вас нет устаревших двоичных файлов (как указано Одедом) ...

Установите точку останова в назначении и убедитесь, что оно действительно выполняется. Затем, сразу после назначения (используйте Step Over), проверьте значение direction.

Если это правильно в этот момент, то что-то еще вызывает его сброс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...