Keyboard.GetState()。IskeyDown()无法按预期工作

时间:2015-02-14 13:18:50

标签: c# monogame

以下是我的Player类的更新方法:

timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds;
KeyboardState state = Keyboard.GetState();
if (state.IsKeyDown(Keys.Up)) {
    if (currentFrame < 7) currentFrame = 7;
    if (timer >= delay) {
        if (currentFrame < 13) {
            currentFrame++;
        }
        else if (currentFrame == 13) {
            currentFrame = 7;
        }
        timer = 0;
    }
}
else {
    if (currentFrame > 7) currentFrame = 1;
    if (timer >= delay) {
        if (currentFrame < 6) {
            currentFrame++;
        }
        else if (currentFrame == 6) {
            currentFrame = 1;
        }
        timer = 0;
    }
}
sourceRect.X = currentFrame * 48 - 48; //I subtract 48 here to make the first frame 1 not 0.

这是绘制方法:

spriteBatch.Draw(texture, position, sourceRect, Color.White);

我要做的是当向上键关闭时,显示第7帧到第13帧的动画(来自精灵表)。 当向上键未关闭时,将绘制第1帧到第6帧的动画 问题:当我一直按下向上键时,它工作正常,但当我按下向上键一次时,动画就会卡在第7帧。

2 个答案:

答案 0 :(得分:0)

if (currentFrame > 7) currentFrame = 1;

尝试更改

if (currentFrame >= 7) currentFrame = 1;

答案 1 :(得分:0)

详细说明来自@Silveor的回答:首次通过循环,我们假设currentFrame为1且timer小于delay

  1. 你按下了键,Keys.Up是键。
  2. currentFrame小于7(为1),因此请将其设为7。
  3. timer小于delay,因此请跳过增加currentFrame的代码
  4. 下次通过该代码:您只按了向上键(没有按住它),因此Keys.Up不是按键。
  5. currentFrame不小于7(为7),所以不要将其设置为1
  6. 我们假设timer大于delay。由于currentFrame不小于6或等于6
  7. currentFrame仍然不会增加或设置为1
  8. 没有代码可以将currentFrame更改为其他任何内容,因此它会卡在第7帧。
  9. 因此,如果您在上面的步骤(5)中检查值7,那么您可以将其设置为1.这就是为什么@ Silveor的答案是正确的。 :)