按钮按下多次调用方法

时间:2012-11-06 21:37:33

标签: c# xna

我正在进行XNA游戏,但我遇到了一个问题。每当我按下游戏中的某个键时,按键触发的方法会被多次调用。例如,当用户按下攻击按钮(空间)时,角色在一次按键内攻击10次。我希望按键只触发一次方法。即使用户按下某个键,我也希望只调用一次方法。现在我已经通过在每次按下按钮后写一个thread.sleep来解决它,但这看起来非常不合适。我希望我的问题是可以理解的。提前谢谢!

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
 }

答案 2 :(得分:0)

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

if(keyIsPressed() && !myFlag)
{
   //do stuff
   myFlag = true;
}
else if(!keyIsPressed())
   myFlag = false;