【问题标题】:Multiple key presses doing different events in C#在 C# 中执行不同事件的多个按键
【发布时间】:2010-04-21 19:37:20
【问题描述】:

private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.W) player1.moveUp(); if (e.KeyCode == Keys.NumPad8) player2.moveUp(); }

在上面的代码中, moveUp 方法基本上只是增加一个值。我想要它,以便可以同时按下(或按住)两个键,并且两个事件都会触发。 谢谢, 内维克

【问题讨论】:

  • 还有什么问题?我认为您的代码应该可以工作。但 Nayan 有更好的选择。

标签: c# keypress keydown


【解决方案1】:

获取键盘状态并检查所需按键的状态。

活动并不是玩游戏的最佳方式。您需要更快的响应。

[DllImport("user32.dll")]
public static extern int GetKeyboardState(byte [] lpKeyState);
...
byte[] bCharData = new byte[256];
GetKeyboardState(bCharData);


另一种方式,取自here

[DllImport("user32.dll")]
static extern short GetKeyState(VirtualKeyStates nVirtKey);
...
public static bool IsKeyPressed(VirtualKeyStates testKey)
{
    bool keyPressed = false;
    short result= GetKeyState(testKey);

    switch (result)
    {
        case 0:
            // Not pressed and not toggled on.
            keyPressed = false;
            break;

        case 1:
            // Not pressed, but toggled on
            keyPressed = false;
            break;

        default:
            // Pressed (and may be toggled on)
            keyPressed = true;
            break;
    }

    return keyPressed;
}


More links.

基本上,这些已经在网上提供。在询问之前尝试搜索。它会更快:)

【讨论】:

  • +1 这是正确的,事件对于游戏来说太慢了,如果你在“游戏循环”中处理好关键状态,它会更快,响应更快
【解决方案2】:

假设您有一个“游戏循环”来更新您使用键盘移动的对象。 KeyDown 事件应将对象状态更改为“向上移动”。然后你的循环每次运行时都会给它新的位置。

KeyUp 事件应将状态更改回“空闲”。如果状态仍在“向上移动”。

您现在不再依赖重复击键来保持对象移动。并且玩家同时按下多个键也不会有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2016-11-26
    相关资源
    最近更新 更多