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