2016-12-31 2 views
0

UWP 용 간단한 2D 게임 엔진을 작성 중입니다. XNA에서 가져온 코드 스 니펫 (snippet)을 가지고 특정 키가 눌려 졌는지 확인하고 (아래 참조), 비슷한 것을하려고합니다.UWP에서 이벤트없이 누름 키 감지

내 게임 엔진에서는 전용 이벤트 핸들러 (KeyDown 등)를 사용하지 않고 대신 내 게임 루프에서 누른 키를 확인합니다 (가능한 경우 가능). 그 이유 중 하나는 키와 타이머를 동시에 사용하여 총알이 발사되는 빈도를 제어 할 수 있다는 것입니다. 또한 위쪽 및 오른쪽 화살표 키는 플레이어 1에 대각선 운동을 제공하고 다른 플레이어 (동일한 키보드 사용)는 A 및 W 키를 사용하여 다른 방향으로 문자를 이동시키는 등 키가 서로 독립적이되도록합니다. 그들은 둘 다 때때로 레이저 총을 발사합니다. 마지막으로, 나는 항상 내 게임 코드의 나머지 부분과는 별도로 동작하는 이벤트 핸들러를 사용하여 컨트롤이 결여되었다. 이것은 KeyPress 이벤트에서 특히 그렇습니다.

public void DrawHelp() 
     { 
      if (Keyboard.GetState().IsKeyDown(Keys.Tab)) 
      { 

을 .. 그리고 이것은 내가 사용하는 노력하고있어입니다 : 내가 찾은

코드는 다음과 같습니다. 그러나 Keyboard 클래스 단어는 Intellisense에서 나에게 제공되지 않습니다 (Windows.UI.Xaml.Input; using이 기본적으로 첨부되어 있음에도 불구하고). ,

int counter = 0; 

    // Raised every tick while the DispatcherTimer is active. 
    private void EachTick(object sender, object e) 
    { 
     TrackKeyboard(); 
     CalculateMoves(); 
     Physics.CollisionDetection(); 
     DrawGame(); 
    } 

    private void TrackKeyboard() 
    { 
     if (Keyboard.GetState().IsKeyDown(Keys.P)) PauseGame(); 

     if (counter % 10 == 0) //control movements 
     { 
      if (Keyboard.GetState().IsKeyDown(Keys.Down)) AddSpeed("Player1", 0, -1); 
      if (Keyboard.GetState().IsKeyDown(Keys.Left)) AddSpeed("Player1", -1, 0); 
      if (Keyboard.GetState().IsKeyDown(Keys.Up)) AddSpeed("Player1", -1, 0); 
      if (Keyboard.GetState().IsKeyDown(Keys.Right)) AddSpeed("Player1", 0, 1); 
      if (Keyboard.GetState().IsKeyDown(Keys.W)) AddSpeed("Player2", -1, 0); 
      if (Keyboard.GetState().IsKeyDown(Keys.D)) AddSpeed("Player2", 0, 1); 
      if (Keyboard.GetState().IsKeyDown(Keys.S)) AddSpeed("Player2", -1, 0); 
      if (Keyboard.GetState().IsKeyDown(Keys.A)) AddSpeed("Player2", 0, 1); 
     } 

     if (counter % 5 == 0) //fire 
     { 
      if (Keyboard.GetState().IsKeyDown(Keys.Space)) Fire("Player1"); 
      if (Keyboard.GetState().IsKeyDown(Keys.X)) Fire("Player2"); 
     } 
    } 

를 그래서이 뭔가를 작성할 수 있습니다 : - (그것은 내가 원하는 것을 보여주기 위해 그냥 코드가 잘못)

는 내가 생각하고있어 기본적으로 문이 경우의 연속이다 UWP 및 만약 그렇다면 : 어떻게?

저는 Bing과 Google에서이를 검색했지만 UWP에 대한 정보는 거의 없습니다.

나는 비슷한 질문을 CodeProject (https://www.codeproject.com/Questions/1107441/How-do-I-register-events-from-two-players-in-UWP)에서 발견했다. 그러나 나는 대답하기에 너무 어렵고, 어쨌든이 코드를 게임 루프에 포함시키는 편이 더 좋다.

너무

감사합니다 (또한. 내가 걸릴려고 경로 내가 인식되지 않을 수있는 몇 가지 기술적 인 이유로 바보 있으면 알려 주시기 바랍니다) 및 새해 복 많이 받으세요!

페터

답변

1

UWP에서, 이러한 방법 사용 CoreWindow에서 키 상태를 확인해야합니다 :

Window.Current.CoreWindow.GetKeyState(VirtualKey).HasFlag(CoreVirtualKeyStates); 

당신은 당신이이 같은 예에 대한 정보를 얻으려면 키와 상태를 지정해야을 :

if(Window.Current.CoreWindow.GetKeyState(VirtualKey.Escape).HasFlag(CoreVirtualKeyStates.Down)) 
{ 
    // Escape key pressed 
} 

당신이해야뿐만 아니라이 같은 GetKeyState 메서드에서 반환 값 비교 :

0123을
Window.Current.CoreWindow.GetKeyState(VirtualKey) == CoreVirtualKeyStates.Down; 

키를 누를 때 CoreVirtualKeyStates.Down | CoreVirtualKeyStates.Locked을 반환 할 수 있기 때문에 조건은 거짓입니다.

+1

답장을 보내 주셔서 감사합니다. 내가 유토피아를 시도 할 기회를 얻었을 때 나는 대답을 채점 할 것이다. – user2040543

+0

안녕하세요, 어쩌면 미안 해요. 어리석은 것 같아요.하지만이게 어떻게 열쇠를 찾아내는 데 열중할지는 모르겠군요. 좀 더 완벽한 예를 들어 주거나 ​​포인터를 가리키는 데 문제가 될 수 있습니까? – user2040543

+0

@ user2040543 예 : –