루프에서 다음 코드를 실행하면 (var enterKey = Keyboard.GetState().IsKeyDown(Keys.Enter);
) Enter 키를 눌러 키를 놓은 후에도 true를 반환합니다.Xna의 KeyboardState.IsKeyDown()은 키를 누르면 사라집니다.
내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까?
루프에서 다음 코드를 실행하면 (var enterKey = Keyboard.GetState().IsKeyDown(Keys.Enter);
) Enter 키를 눌러 키를 놓은 후에도 true를 반환합니다.Xna의 KeyboardState.IsKeyDown()은 키를 누르면 사라집니다.
내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까?
키보드의 상태가 업데이트 (...)주기 (또는 이에 상응하는 이에 상응하는 것) 사이에서만 새로 고침되어 루핑이 유용하지 않을 것으로 생각됩니다.
키보드 상태의 변경을 감지하려면 키보드 상태 과 연속적인 업데이트 (...) 사이를 비교해야합니다.
은 다음과 같이 확인해보십시오 :
KeyboardState newState;
public void Update(...)
{
newState = Keyboard.GetState();
if(newState.IsKeyDown(Keys.Enter))
{
*do what you want here*
}
}
이 방법은 각 프레임에 서로 다른 키 입력을 확인할 수 있도록 각 업데이트에 당신이 (키를 누르면) 현재 키보드 상태를 업데이트하고 있습니다.
편집 :
당신은 한 번의 클릭으로 확인하고 싶은 것, 그래서 대신이 질문에, 여기에 질문에 "보너스"입니다. 비슷한 코드입니다 :
KeyboardState newState, oldState;
public void Update(...)
{
//gets keyboard state for this single frame
newState = Keyboard.GetState();
//checks if enter is down
if(newState.IsKeyDown(Keys.Enter))
{
*do what you want here*
}
// checks if enter is clicked
// if statement asks if in this frame, enter button is down
// AND if enter button was not down in the last frame
// this way, if statement below will fire only on each click
if(newState.IsKeyDown(Keys.Enter) && oldState.IsKeyUp(Keys.Enter))
{
*do what you want here*
}
//set old state to new state, so the next frame knows
//what was happening in frame before that one
oldState = newState;
}
컴퓨터를 다시 시작하면 문제가 해결되면서 코드 외부에 버그가 있었을 것입니다.
내가 언급했던 루프는 사실 Update() 메소드였습니다. 게임이 업데이트 될 때마다 호출되어야합니다. 맞습니까? – Omegastick
Monset의 답변은 주요 변경 사항을 감지하는 공통 패턴을 보여줍니다. – lzcd