Изменение оси Y спрайта с щелчком для перемещения

Я новичок здесь и программирую. Я искал какое-то время, хотя я не могу найти ничего, чтобы помочь с проблемой.

Я пытаюсь сделать мой цикл spritesheet через разные рамки для ходьбы моего спрайта, я сделал это легко с IsKeyDown, но когда дело доходит до использования мыши, чтобы идти куда-то, мне потребовалось некоторое время, чтобы избавиться от «плохого» решения:

if (destination.X > position.X)                
                currentFrame.Y = 6;
            if (destination.X > position.X && destination.Y >= position.Y + 35)
                currentFrame.Y = 7;
            if (destination.X > position.X && destination.Y <= position.Y - 35)
                currentFrame.Y = 5;

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

Извините, если это было задано раньше, но я обыскал в течение нескольких часов, прежде чем публиковать это и ничего не нашел.

1
nl ja de

2 ответы

Я немного неясен относительно того, что вы делаете. У вас есть только 2 спрайта, один для левой и один для правой? Это все, что я вижу в вашем текущем коде, но вы имеете в виду анимацию. Я собираюсь предположить, что у вас есть полный набор спрайтов для анимации ходьбы, и в этом случае я думаю, что этот учебник будет охватывать то, что вам нужно:

http://coderplex.blogspot.ca/2010/04 /2d-animation-part-1-basics.html

(более конкретно, часть 4 учебника: http : //coderplex.blogspot.ca/2010/04/2d-animation-part-4-sprite-animation.html )

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

В качестве альтернативы вы могли бы подробнее рассказать о своих операциях if (если currentFrame = 1, а затем currentFrame = 2, если currentFrame = 2, currentFrame = 3 и т. Д.), Но было бы грязно и довольно сложно поддерживать, если вы когда-либо вносили изменения в графику или способ, которым спрайт вытягивается из спрайта. Это также, скорее всего, будет слишком быстрым, и вам придется использовать таймеры, чтобы замедлить его.

0
добавлено
Да, я не слишком уверен, как это сказать. Мой спрайт-лист - [9,8] с 8 направлениями движения и 9 кадрами анимации. Вот одна из моих клавиатур;
добавлено автор Mad Feesh, источник
Пропустил правило редактирования 5 минут и немного изменил мои объяснения. Да, я не слишком уверен, как это сказать. Мой спрайт-лист - [9,8] с 8 направлениями движения и 9 кадрами анимации. То, что я пытаюсь найти, - это если я нажму «Север» моего спрайта, как сделать изменение спрайта в северной строке, у меня есть циклический переход через 9 разных спрайтов, просто не нахожу, чтобы было легко изменить ряд спрайтов на цикл через координаты мыши. Я проведу ссылку и благодарю вас за ваш ответ.
добавлено автор Mad Feesh, источник

Полагаю, я думаю. Вот мой код (надеясь, что он отформатирован правильно. Извините, если я не собираюсь отвечать на свой вопрос, подумал, что это может быть полезно кому-то другому):

public Vector2 position = new Vector2(200, 200);
    Point frameSize = new Point(48, 92);
    Point currentFrame = new Point(0, 0);
    Point sheetSize = new Point(9, 8);
    float speed = 10;
    Vector2 direction;
    Vector2 destination;
    bool mousePressed = false;
    float difference;


    KeyboardState currentState;
    KeyboardState theKeyboardState;
    KeyboardState oldKeyboardState;

    enum State
    {
        Walking
    }

    State mcurrentState = State.Walking;

    TimeSpan nextFrameInterval =
        TimeSpan.FromSeconds((float)1/16);
    TimeSpan nextFrame;
    MouseState mouseState;
    MouseState oldState;

    public void Move()
    {
        direction = destination - position;
        direction.Normalize();
        position += direction * speed;

        float Xdistance = destination.X - position.X;
        float Ydistance = destination.Y - position.Y;

        difference = (float)Math.Atan2(Ydistance, Xdistance);

        float differ;
        differ = MathHelper.ToDegrees(difference);

        if (destination.X >= position.X || destination.X <= position.X)
        {                
            currentFrame.X++;
            if (currentFrame.X >= 9)
                currentFrame.X = 0;

            //down = 90dg
            if (differ >= 67.6 && differ <= 112.5)
                currentFrame.Y = 0;
            if (differ >= 112.6 && differ <= 157.5)
                currentFrame.Y = 1;
            if (differ >= 157.6 && differ <= 180 || differ >= -180 && differ <= -157.5)
                currentFrame.Y = 2;
            if (differ >= -157.4 && differ <= -112.5)
                currentFrame.Y = 3;
            if (differ >= -112.4 && differ <= -67.5)
                currentFrame.Y = 4;
            if (differ >= -67.4 && differ <= -22.5)
                currentFrame.Y = 5;
            if (differ >= -22.4 && differ <= 22.5)
                currentFrame.Y = 6;
            if (differ >= 22.6 && differ <= 67.5)
                currentFrame.Y = 7;
        }
    }

    public void Update()
    {
        mouseState = Mouse.GetState();
        currentState = Keyboard.GetState();
        theKeyboardState = Keyboard.GetState();

        if (mousePressed == true)
        {
            if (Vector2.DistanceSquared(destination, position) >= speed * speed)
            {
                Move();
            }
        }

        if (mouseState.LeftButton == ButtonState.Pressed && oldState.LeftButton == ButtonState.Released)
        {
            int mouseY = mouseState.Y;
            int mouseX = mouseState.X;

            destination = new Vector2(mouseX, mouseY);
            mousePressed = true;
        }

        oldState = mouseState;           

        if (mcurrentState == State.Walking)
        {
            #region KB animation

            if (currentState.IsKeyDown(Keys.Down))
            {
                mousePressed = false;
                currentFrame.X++;
                currentFrame.Y = 0;
                if (currentFrame.X >= 9)
                    currentFrame.X = 0;
                position.Y += speed;
            }

            if (currentState.IsKeyDown(Keys.Up))
            {
                mousePressed = false;
                currentFrame.X++;
                currentFrame.Y = 4;
                if (currentFrame.X >= 9)
                    currentFrame.X = 0;
                position.Y -= speed;
            }

            if (currentState.IsKeyDown(Keys.Right))
            {
                mousePressed = false;
                currentFrame.X++;
                currentFrame.Y = 6;
                if (currentState.IsKeyDown(Keys.Down))
                    currentFrame.Y = 7;
                if (currentState.IsKeyDown(Keys.Up))
                    currentFrame.Y = 5;
                if (currentFrame.X >= 9)
                    currentFrame.X = 0;
                position.X += speed;
            }

            if (currentState.IsKeyDown(Keys.Left))
            {
                mousePressed = false;
                currentFrame.X++;
                currentFrame.Y = 2;
                if (currentState.IsKeyDown(Keys.Down))
                    currentFrame.Y = 1;
                if (currentState.IsKeyDown(Keys.Up))
                    currentFrame.Y = 3;
                if (currentFrame.X >= 9)
                    currentFrame.X = 0;
                position.X -= speed;
            }
        }
        oldKeyboardState = theKeyboardState;
            #endregion

    }

    public void Draw(SpriteBatch spriteBatch, Texture2D character)
    {
        spriteBatch.Begin();

        spriteBatch.Draw(character, position, new Rectangle(frameSize.X * currentFrame.X,
            frameSize.Y * currentFrame.Y, frameSize.X, frameSize.Y), Color.White, 0, new Vector2(frameSize.X/2, frameSize.Y/2), 1, SpriteEffects.None, 0);

        spriteBatch.End();
    }
0
добавлено