2012-11-06 2 views
1

저는 XNA 게임을하고 있는데 문제가 생겼습니다. 게임에서 키를 누를 때마다 키 누름으로 트리거되는 메서드가 여러 번 호출됩니다. 예를 들어 사용자가 공격 버튼 (공백)을 누르면 한 번의 키 누름으로 10 번 공격합니다. 키를 눌러 메서드를 한 번만 트리거하면됩니다. 사용자가 키를 누르고있는 경우에도 일부 메서드는 한 번만 호출되기를 원합니다. 지금은 각 버튼을 눌렀을 때마다 thread.sleep을 작성하여 해결했지만 매우 불충분 해 보입니다. 내 문제가 이해되기를 바랍니다. 미리 감사드립니다!단추 누르기 방식을 여러 번 호출합니다.

+1

당신은 플래그가 필요합니다. 키를 놓을 때 플래그를 재설정하십시오. –

답변

5

키 입력시 버튼에 플래그를 지정하고 키 업 해제하지 않은 상태로 플래그를 지정해야합니다. keydown 메소드 중 ... 버튼이 이미 내려져 있는지 확인하십시오. 키가있을 때까지 아무 일도하지 않습니다.

키 누름 중에 응용 프로그램/게임/메시지 대기열을 통해 초당 수천 메시지를받는 모든 것입니다. 스페이스 바 슈퍼를 빠르게 공격하더라도 메시지 대기열을 통해 ~ 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; 
} 

사용하고, 당신이 개 전역 변수가 필요합니다.

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

관련 문제