在UWP中检测没有事件的按键

时间:2016-12-31 08:58:48

标签: c# keyboard uwp

我正在为UWP编写一个简单的2D游戏引擎。我有一个从XNA获取的代码片段,检查是否按下某个键(见下文),我正在尝试做类似的事情。

事实上,在我的游戏引擎中,我宁愿不使用专用事件处理程序(KeyDown等),而只是检查游戏循环中的按键 - 如果可以的话。这样做的一个原因是我可以控制例如如果持续按下按键(使用计时器和模式),子弹会发射的频率。它还可以让键彼此独立,例如向上和向右箭头键为玩家1提供对角线移动,而另一个玩家(使用相同的键盘)使用键A和W在另一个方向上移动他/她的角色,他们偶尔都会发射激光枪。最后,我一直考虑使用与我的其余游戏代码分开工作的事件处理程序,导致缺乏控制。对于KeyPress事件,我认为尤其如此。

我找到的代码如下:

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

..这就是我正在尝试使用的东西。但是,对于我来说,在Intellisense中没有出现Keyboard类词(尽管默认情况下附加了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和Google进行了一些搜索,但是关于UWP的信息仍然很少。

我在CodeProject上发现了一个类似的问题(https://www.codeproject.com/Questions/1107441/How-do-I-register-events-from-two-players-in-UWP),但我的回答太难了,无论如何,我更倾向于在游戏循环中包含这些代码,如上所述上方。

(另请告诉我,如果由于某些我可能不知道的技术原因,我试图采取的路线是愚蠢的。)

非常感谢新年快乐!

皮特

1 个答案:

答案 0 :(得分: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,然后条件将为假。