2012-11-06 132 views
1

我正在开发XNA游戏,并且遇到了问题。每当我按下游戏中的按键时,按键触发的方法就会被多次调用。例如,当用户按下攻击按钮(空间)时,在一次按键内人物攻击就像10次。我想要按键只触发一次该方法。即使用户按下某个键,我也希望只调用一次方法。现在我已经通过在每次按下按钮之后编写一个thread.sleep来解决它,但是这看起来非常不够高效。我希望我的问题可以理解。提前致谢!多次按下按钮调用方法

+1

你需要一个标志。钥匙释放后重置标志。 –

回答

5

您需要将该按钮标记为在keydown上按下,然后在按键上标记为未按下。在keydown方法期间,检查按钮是否已经关闭..如果是..在keyup设置它之前不做任何事情。

原因是,在按键期间,您的应用程序/游戏/无论通过其消息队列每秒接收数千条消息。即使你将空格键快速超过,也有可能通过消息队列处理大约50条WM_KEYDOWN消息。

例子:

bool SpacebarPressed = false; 

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

private void KeyUp() { 
    if (SpacebarPressed) SpacebarPressed = false; 
} 
0

你需要你当第一次按下该键设置,然后松开按键时复位的标志。一个粗略的例子:

if(keyIsPressed() && !myFlag) 
{ 
    //do stuff 
    myFlag = true; 
} 
else if(!keyIsPressed()) 
    myFlag = false; 
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; 
} 
+0

我使用的解决方案相同,但我认为如果添加突出显示键盘状态更新位置的Update()方法代码,可以稍微改进您的答案。 (即澄清“背后的一帧”) – neeKo

+1

添加了您的建议 – Cyral