您好我在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 你能帮我解决一下吗?
答案 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)