基于XNA平铺的运动

时间:2011-03-05 19:10:10

标签: dictionary grid xna

我正在尝试在XNA中制作基于2D平铺的自上而下的游戏。它是16 x 16个图块,每个图块是25个像素。

我有一个字符精灵从(0,0)第一个拼贴开始,我正在尝试使用键盘从拼贴到拼贴。所以在Update方法中,当按下箭头键时,我尝试在位置向量的x或y上加或减25。它在移动时似乎在瓷砖中对齐,但它一次移动大约4-5个瓷砖而不是仅仅1个瓷砖。我已经尝试将它与gameTime.TotalGameTime.TotalSeconds相乘,但它似乎没有帮助。

我是使用XNA的新手。有没有人有任何教程或可以帮助如何计算运动?提前谢谢。

2 个答案:

答案 0 :(得分:8)

如果您只是检查IsKeyDown每一帧,它会说明每个帧都按下了它。按每秒60帧,按一个键将导致它处于几个帧的向下状态。因此,在每一帧你都在移动你的角色!当你放开钥匙的时候 - 他会搬几个方格。

如果你想检测每个按键(键进入“向下”状态),你需要这样的东西:

KeyboardState keyboardState, lastKeyboardState;

bool KeyPressed(Keys key)
{
    return keyboardState.IsKeyDown(key) && lastKeyboardState.IsKeyUp(key);
}

override void Update(GameTime gameTime)
{
    lastKeyboardState = keyboardState;
    keyboardState = Keyboard.GetState();

    if(KeyPressed(Keys.Right)) { /* do stuff... */ }
}

但是如果你想在按住键时添加“重复”效果(就像输入中发生的那样),你需要计算时间 - 就像这样:

float keyRepeatTime;
const float keyRepeatDelay = 0.5f; // repeat rate

override void Update(GameTime gameTime)
{
    lastKeyboardState = keyboardState;
    keyboardState = Keyboard.GetState();

    float seconds = (float)gameTime.ElapsedGameTime.TotalSeconds;

    if(keyboardState.IsKeyDown(Keys.Right))
    {
        if(lastKeyboardState.IsKeyUp(Keys.Right) || keyRepeatTime < 0)
        {
            keyRepeatTime = keyRepeatDelay;

            // do stuff...
        }
        else
            keyRepeatTime -= seconds;
    }
}

答案 1 :(得分:0)

使用IsKeyDown时,您不必使用计时器。

public void HandleInput(KeyboardState keyState)
{
   if (keyState.IsKeyDown(Keys.Left))
   {
      //go left...
   }
}