你好,我在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)