1

我正在开发一款 XNA 游戏,但遇到了问题。每当我在游戏中按键时,按键触发的方法都会被多次调用。例如,当用户按下攻击按钮(空格)时,字符会在一次按键内攻击 10 次。我希望按键仅触发一次该方法。即使用户按住一个键,我也希望某些方法只被调用一次。现在我已经通过在每次按下按钮后编写一个 thread.sleep 来解决它,但这似乎非常低效。我希望我的问题可以理解。提前致谢!

4

3 回答 3

5

您需要在 keydown 上将按钮标记为按下,然后在 keyup 上将其标记为未按下。在keydown方法期间..检查按钮是否已经按下..如果是..在keyup设置它之前什么都不做。

这样做的原因是,在按键期间,您的应用程序/游戏/任何通过其消息队列每秒接收数千条消息的东西。即使您超级快速地敲击空格键,也有可能通过消息队列处理了大约 50 条 WM_KEYDOWN 消息。

例子:

bool SpacebarPressed = false;

private void KeyDown() {
    if (!SpacebarPressed) {
        SpacebarPressed = true;
        DoSomethingWithSpacebarBeingPressed();
    }
}

private void KeyUp() {
    if (SpacebarPressed) SpacebarPressed = false;
}
于 2012-11-06T21:41:40.940 回答
2

我知道这已经得到解答,但是您可以使用这样的方法。让 oldKeyBoardState 在当前帧之后一帧,然后做IsKeyToggled(Keys.Space)

bool IsKeyToggled(Keys key)
{
    if (!oldKeyBoardState.IsKeyDown(key) && keyboardState.IsKeyDown(key))
       return true;
    else
       return false;
}

用于设置一个后面,你将需要 2 个全局变量。

 public static KeyboardState keyboardState;
 public static KeyboardState oldKeyBoardState;

您的Update()方法应如下所示:

 protected override void Update(GameTime gameTime)
 {
   keyboardState = Keyboard.GetState();
   //TODO: Add update logic here
   //This comes last
   oldKeyBoardState = keyboardState;
 }
于 2012-11-06T22:56:35.250 回答
0

您需要在第一次按下键时设置一个标志,然后在释放键时重置。一个粗略的例子:

if(keyIsPressed() && !myFlag)
{
   //do stuff
   myFlag = true;
}
else if(!keyIsPressed())
   myFlag = false;
于 2012-11-06T21:44:32.277 回答