2016-12-31 61 views
0

我正在爲UWP編寫一個簡單的2D遊戲引擎。我有一個從XNA獲取的代碼片段,檢查是否按下了某個鍵(見下文),並且我正在嘗試做類似的事情。事實上,在我的遊戲引擎中,我寧願不使用專用事件處理程序(KeyDown等),而只是在我的遊戲循環中檢查按下的鍵 - 如果可以的話。其中一個原因是,我可以控制例如如果持續按下按鍵(使用計時器和模組),子彈發生的頻率。它也可以讓按鍵相互獨立,例如向上和向右箭頭鍵爲玩家1提供對角線移動,而另一位玩家(使用相同的鍵盤)則使用按鍵A和W在另一個方向移動他/她的角色,並且他們偶爾會發射激光槍。最後,我一直考慮使用事件處理程序與我的其他遊戲代碼分開工作,導致缺乏控制。我認爲,KeyPress活動尤其如此。在UWP中檢測沒有事件的按鍵

的代碼,我發現是這樣的:

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

..和這就是我想要使用。但是,對於我來說,Intellisense中沒有出現鍵盤類單詞(儘管Windows.UI.Xaml.Input; using是默認附加的)。

我在想什麼的基本上是一系列的if語句(代碼是錯誤的 - 它只是爲了顯示我想要的):

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和谷歌上搜索了一些這方面的內容,但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方法是這樣的返回值:

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

因爲它可能會返回CoreVirtualKeyStates.Down | CoreVirtualKeyStates.Locked當按鍵,條件將是假的。

+1

非常感謝您的詳細回覆。當我有機會嘗試時,我會給答案評分。 – user2040543

+0

你好,對不起,也許聽起來很愚蠢,但我不明白這是如何歸結爲找到特別的關鍵。請問您能否給我一個更完整的例子或指向一個指針? – user2040543

+0

@ user2040543我已經添加了一個示例 –