XNA中的KeyboardState c#

时间:2014-02-24 15:32:16

标签: c# visual-studio-2010 xna-4.0

您好我在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

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

1 个答案:

答案 0 :(得分:0)

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

考虑这种情况:

index = 0

S被按下。我们正试图增加指数。

对于要递增的索引,oldState键S必须为up或者oldState键Down必须为up。

注意OR,这就是问题所在。即使在下一帧,oldState S未启动,Down键仍然处于运行状态,因此除非同时按下两个键,否则OR语句将始终返回true。现在,索引每帧增加(非常快),同时按下S按钮。最简单的解决方法是将oldState 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)