【问题标题】:Change texture on key down按键时更改纹理
【发布时间】:2013-12-12 09:48:54
【问题描述】:

这是我获取键盘状态并根据按下的键更改纹理的方法。

private void CheckKeyboardAndUpdateMovement()
{
    KeyboardState keyboardState = Keyboard.GetState();
    if (keyboardState.IsKeyUp(Keys.Left)) { ChangeTexture(1); }
    if (keyboardState.IsKeyUp(Keys.Right)) { ChangeTexture(2); }
    if (keyboardState.IsKeyDown(Keys.Left))
    {
        Movement -= Vector2.UnitX;
        ChangeTexture(3);
    }
    if (keyboardState.IsKeyDown(Keys.Right))
    {
        Movement += Vector2.UnitX;
        ChangeTexture(4);
    }
    if ((keyboardState.IsKeyDown(Keys.Space) || keyboardState.IsKeyDown(Keys.Up)) && IsOnFirmGround())
    {
        Movement = -Vector2.UnitY * JumpHeight;
    }
}

如果按下方向,它就可以工作,但是当没有按下任何东西时它就不会做自己的工作(只是因为IsKeyUp 都是真的)。只有案例的顺序才能防止在移动精灵时显示静态纹理...... 我的问题是,我怎样才能彻底解决这个问题?我已经有了一个想法,但我一点也不喜欢它......

【问题讨论】:

  • 那 4 个纹理是什么?而且,更重要的是,您的游戏在没有按下任何按钮时应该怎么做?我不明白。
  • 它们是(1)“精灵向左静止”,(2)“精灵向右静止”,(3)“精灵向左行走”的纹理,(4 ) “精灵向右走”。当什么都没有按下时,它必须静止不动,但面向最后一个方向。
  • 是的,肯定更好,而且你的解决方案还不错。

标签: c# xna xna-4.0 keyboard-events


【解决方案1】:

如果您想要其他解决方案,但仍与您的类似。

enum Direction { Left = 1, Right = 2}
Direction dir = Direction.Left; //or whatever

private void CheckKeyboardAndUpdateMovement()
{
    KeyboardState keyboardState = Keyboard.GetState();

    ChangeTexture((int)dir);
    if (keyboardState.IsKeyDown(Keys.Left))
    {
        Movement -= Vector2.UnitX;
        ChangeTexture(3);
        dir = Direction.Left;
    }
    if (keyboardState.IsKeyDown(Keys.Right))
    {
        Movement += Vector2.UnitX;
        ChangeTexture(4);
        dir = Direction.Right;
    }
    if ((keyboardState.IsKeyDown(Keys.Space) || keyboardState.IsKeyDown(Keys.Up)) && IsOnFirmGround())
    {
        Movement = -Vector2.UnitY * JumpHeight;
    }
}

你可以用行走的精灵做类似的事情。

【讨论】:

    【解决方案2】:

    我想到的最糟糕的解决方案是在按下最后一个键时存储精灵方向并检查下一次更新,但是我必须控制的键和纹理会变得一团糟。 ..

    // Having a "bool leftDirectionOnLastMovement;" (worst name ever seen)
    private void CheckKeyboardAndUpdateMovement()
    {
        KeyboardState keyboardState = Keyboard.GetState();
        if (keyboardState.IsKeyUp(Keys.Left) && leftDirectionOnLastMovement)
            ChangeTexture(1);
        if (keyboardState.IsKeyUp(Keys.Right) && !leftDirectionOnLastMovement)
            ChangeTexture(2);
        if (keyboardState.IsKeyDown(Keys.Left))
        {
            Movement -= Vector2.UnitX;
            ChangeTexture(3);
            leftDirectionOnLastMovement = true;
        }
        }
        if (keyboardState.IsKeyDown(Keys.Right))
        {
            Movement += Vector2.UnitX;
            ChangeTexture(4);
            leftDirectionOnLastMovement = false;
        }
        }
        if ((keyboardState.IsKeyDown(Keys.Space) || keyboardState.IsKeyDown(Keys.Up)) && IsOnFirmGround())
        {
            Movement = -Vector2.UnitY * JumpHeight;
        }
    }
    

    我真的希望有人会建议我一个更好的方法来做到这一点......

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 2012-03-07
      • 1970-01-01
      相关资源
      最近更新 更多