【问题标题】:Detecting keys pressed without events in UWP在 UWP 中检测无事件按下的键
【发布时间】:2016-12-31 21:18:44
【问题描述】:

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

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

我找到的代码是这样的:

 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 和 Google 上进行了一些搜索,但关于 UWP 的信息仍然很少。

我在 CodeProject (https://www.codeproject.com/Questions/1107441/How-do-I-register-events-from-two-players-in-UWP) 上发现了一个类似的问题,但答案对我来说太难理解了,无论如何,我宁愿将这段代码包含在游戏循环中,如上所述。

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

非常感谢,新年快乐!

彼得

【问题讨论】:

    标签: c# keyboard 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,然后条件为假。

    【讨论】:

    • 非常感谢您的详细回复。当我有机会尝试时,我会为答案评分。
    • 您好,对不起,听起来可能很愚蠢,但我不明白这将如何归结为特别是找到钥匙。能否麻烦您提供一个更完整的示例或指向一个示例?
    • @user2040543 我添加了一个例子
    • @MarianDolinský 你好。你有办法检测 UWP 中的 Alt 图形键吗?当我按下 Alt Gr 键时,我的代码将按下的键显示为 VirtualKey.Control。
    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多