C# XNAC中的键盘状态#

C# XNAC中的键盘状态#,c#,visual-studio-2010,xna-4.0,C#,Visual Studio 2010,Xna 4.0,你好,我在XNA遇到了一些问题,这里是我的代码 我制作了一个长度为4的数组 //初始化 Keyboard oldState=Keyboard.GetState(); int指数=0; //更新 KeyboardState currentState=Keyboard.GetState(); if(index!=0&((currentState.IsKeyDown(Keys.Z)| | currentState.IsKeyDown(Keys.Up)) &&(!oldState.IsKeyDown(K

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

//初始化
Keyboard oldState=Keyboard.GetState();
int指数=0;
//更新
KeyboardState currentState=Keyboard.GetState();
if(index!=0&((currentState.IsKeyDown(Keys.Z)| | currentState.IsKeyDown(Keys.Up))
&&(!oldState.IsKeyDown(Keys.Z))| |(!oldState.IsKeyDown(Keys.Up()))
{
指数=指数-1;
}
else if(索引
我的主要问题是,当我按Up/Z或Down/S时,如果我不稍微按一下,光标将从0处的3跳到0处的3
你能帮我解决这个问题吗?

问题在于“if”语句的布尔逻辑(与覆盖oldState无关)

考虑这种情况:

索引=0

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

对于要递增的索引,oldState键S必须向上,或者oldState键Down必须向上

注意OR,这就是问题所在。即使在下一帧中,oldState S未向上,Down键仍向上,因此OR语句将始终返回true,除非同时按下两个键。现在,索引每帧增加一次(非常快),同时按下S按钮。最简单的修复方法是将旧状态S和之间的OR更改为and

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

为了清晰起见,还可以使用IsKeyUp()

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

您正在过度使用旧的状态变量。所以这两个变量总是相等的。您还需要记住,这部分代码在每次调用时都会运行,通常约为60 fps。
oldState.IsKeyUp(Keys.S)) && oldState.IsKeyUp(Keys.Down)