【问题标题】:C# WPF detecting multiple pressed keys at the same time [duplicate]C#WPF同时检测多个按下的键[重复]
【发布时间】:2020-03-28 19:39:43
【问题描述】:

我正在尝试使用 C# 和 WPF 编写一个小型空间射击游戏。我希望能够通过分别按住向上或向下键来上下移动我的太空船。这样可行。但是,如果我想使用空格键开火,虽然我希望它继续,但运动会停止。我正在使用一个键事件处理程序,该处理程序已注册并实现如下:

MainWindow.KeyDown += new KeyEventHandler(OnKeyDown);

...

private void OnKeyDown(object sender, KeyEventArgs e)
{
    double Shift = 20;

    switch (e.Key)
    {
        case Key.Down:
            if (Y < Model.Height - Geometry.Height - Shift)
                Y += Shift;
            break;
        case Key.Up:
            if (Y > Shift)
                Y -= Shift;
            break;
        case Key.Space:
            Fire();
            break;
    }
}

关于如何实现我想要的任何想法?

【问题讨论】:

标签: c# wpf game-development


【解决方案1】:

您是否尝试将以下行添加到方法的末尾(iow。方法中的最后一行)。

e.Handled = true;

我希望您已经检查了标记为重复的问题。

您还可以在方法的第一行添加以下内容:

如果(e.Handled)返回;

希望能解决这个问题。

【讨论】:

  • 我试过了,但没有帮助。由于某种原因,每次 KeyDown 之后都会立即触发 KeyUp,即使我一直按住键。
  • 答案已更新。让我知道你是否进入下一个;)
【解决方案2】:

既然您正在编写游戏,也许最好的出路是使用游戏引擎轴的逻辑。将运动逻辑与动作逻辑分离,使用定时器控制轴灵敏度:

using System.Timers;
...
//checks the key pressed every 50 milliseconds
Timer timer = new Timer(50); //tune this value to get the desired result
timer.Elapsed += Timer_Elapsed;
timer.Start();
...

private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
    //timers execute on another Thread so this is necessary
    Dispatcher.Invoke(OnInputAxis);
}

private void OnInputAxis()
{
    if (Keyboard.IsKeyDown(Key.Down))
    {
        if (Y < Model.Height - Geometry.Height - Shift)
                Y += Shift;
    }

    if (Keyboard.IsKeyDown(Key.Up))
    {
         if (Y > Shift)
                Y -= Shift;
    }
}
...
//you can keep your fire action in a keydown event
private void OnKeyDown(object sender, KeyEventArgs e)
{
   if (e.Key == Key.Space)
   {
       fire();
   }
}


【讨论】:

    猜你喜欢
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多