XNA c# 中的键盘状态



你好,我在XNA中遇到了一些麻烦,这是我的代码我制作一个长度为 4 的数组

//Initialize
Keyboard oldState = Keyboard.GetState();
int index = 0;
//Update
KeyboardState currentState = Keyboard.GetState();
if (index != 0 && ((currentState.IsKeyDown(Keys.Z) || currentState.IsKeyDown(Keys.Up))
        && ((!oldState.IsKeyDown(Keys.Z)) || (!oldState.IsKeyDown(Keys.Up)))))
        {
            index = index - 1;
        }
        else if (index < menuArray.Length && ((currentState.IsKeyDown(Keys.S) || currentState.IsKeyDown(Keys.Down))
        && ((!oldState.IsKeyDown(Keys.S)) || (!oldState.IsKeyDown(Keys.Down)))))
        {
            index = index + 1;
        }
oldState = currentState;
if (index == 0)
    //put the texture here
if (index == 1)
    //put the texture here
if (index == 2)
    // put the texture here
if (index == 3)
    // put the texture here

我的主要问题是当我按向上/Z 或向下/S 时,如果我没有稍微按一下,光标将从 0 跳到 3 或 3 跳到 0你能帮我解决这个问题吗?

问题在于"if"语句布尔逻辑(与覆盖 oldState 无关)。

考虑这种情况:

索引 = 0

按下 S。我们正在尝试增加指数。

要使索引递增,旧状态键 S 必须启动,或者旧状态键 Down 必须启动。

请注意 OR,这就是问题所在。即使在下一帧中,旧状态 S 未打开,向下键仍处于打开状态,因此除非同时按下两个键,否则 OR 语句将始终返回 true。现在,索引每帧增加一次(非常快),同时按下S按钮。最简单的解决方法是将旧状态 S 和 DOWN 之间的 OR 更改为 AND。

!oldState.IsKeyDown(Keys.S) && !oldState.IsKeyDown(Keys.Down)

!oldState.IsKeyDown(Keys.Z) && (!oldState.IsKeyDown(Keys.Up)

为了清楚起见,您也可以使用 IsKeyUp()。

oldState.IsKeyUp(Keys.S)) && oldState.IsKeyUp(Keys.Down)

最新更新