Перемещение спрайта по диагонали


Я надеюсь, что вы сможете мне помочь.

Я перемещаю свой спрайт в соответствии с положением мыши, когда пользователь нажимает правую кнопку Вот так:

protected override void Update(GameTime gameTime)
{
    int nextX = SpritePosition.X;
    int nextY = SpritePosition.Y;
    int SpriteWidth = 135;
    int SpriteHeight = 135;
    int Speed = 3;

    MouseState ms = Mouse.GetState();
    if (ms.RightButton == ButtonState.Pressed)
    {
        if (ms.X > SpritePosition.X + SpriteWidth) //check to move right
        {
            nextX = SpritePosition.X + Speed;
        }
        else if (ms.X < SpritePosition.X) //check to move left
        {
            nextX = SpritePosition.X - Speed;
        }

        if (ms.Y > SpritePosition.Y + SpriteHeight) //Check to move bottom
        {
            nextY = SpritePosition.Y + Speed;
        }
        else if (ms.Y < SpritePosition.Y) //Check to move top
        {
            nextY = SpritePosition.Y - Speed;
        }

        //Change the Sprite position to be updated in the DRAW.
        SpritePosition = new Rectangle(nextX, nextY, graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height);
    }

    base.Update(gameTime);
}

Сейчас он работает, но вот как он движется:

Неверное движение http://i.imgur.com/xGsFy38.png

Так, как я хочу, чтобы он двигался, как: Движение вправо http://i.imgur.com/kkEnoYD.png

Ребята, теперь я попробовал следующее, Из ответов ниже:

            Vector2 From = new Vector2(SpritePosition.X, SpritePosition.Y);
            Vector2 To = new Vector2(ms.X, ms.Y);
            From = Vector2.Subtract(From,To );
            Vector2 Direction = Vector2.Normalize(From);
            Direction = Direction * Speed;

            SpritePosition = new Vector2(Direction.X, Direction.Y);

Мой спрайт не движется., Что я делаю не так?

3 2
xna

3 ответа:

Я сделал пример с моим кодом ниже, Вот он:

Http://pastebin.com/ep659g76

Я создал простую точку, 5x5 пикселей, которая является объектом на экране. Вы можете превратиться в то, что вам нравится.

Это метод, который я использовал для шутер сверху вниз с spriteanimation. Я преобразовал его из C++ в C#, но он должен работать так же. В моем случае, в зависимости от того, как расположен спрайт, мне пришлось добавить поворот на +90 градусов, чтобы получить правильный результат, но надеюсь, ты это поймешь.

public static class Helper_Direction
{

    // Rotates one object to face another object (or position)
    public static double FaceObject(Vector2 position, Vector2 target)
    {
        return (Math.Atan2(position.Y - target.Y, position.X - target.X) * (180 / Math.PI));
    }

    // Creates a Vector2 to use when moving object from position to a target, with a given speed
    public static Vector2 MoveTowards(Vector2 position, Vector2 target, float speed)
    {
        double direction = (float)(Math.Atan2(target.Y - position.Y, target.X - position.X) * 180 / Math.PI);

        Vector2 move = new Vector2(0, 0);

        move.X = (float)Math.Cos(direction * Math.PI/180) * speed;
        move.Y = (float)Math.Sin(direction * Math.PI / 180) * speed;

        return move;
    }
}

У вас есть две позиции, храните обе как Vector2.

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

Нормализуйте этот вектор, чтобы получить вектор направления.

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

Вам нужно изменить позицию на:

nextY = SpritePosition.Y + SpriteHeight + Speed;

Но это приведет к тому, что спрайт будет прыгать на старте, поэтому я советую вам сначала вычислить позицию финиша, а затем медленно переместить его в эту позицию.