【问题标题】:macOS Key Event Slow RepeatmacOS 按键事件慢速重复
【发布时间】:2018-12-15 04:22:35
【问题描述】:

我正在尝试在 macOS 中创建一个小型 WASD 演示游戏。我使用NSEvent 来处理关键事件。为了检测按键,我正在搜索keyDown 事件。这是我所拥有的:

    NSEvent.addLocalMonitorForEvents(matching: .keyDown) {
        (keyEvent) -> NSEvent? in
        if self.keyDown(with: keyEvent) {
            return nil
        } else {
            return keyEvent
        }
    }

func keyDown(with event: NSEvent) -> Bool {

    userInt.keyDown(key: event.characters)

    return true
}

所以在这里,我按住键(正如您在游戏中所期望的那样),并且我的动作非常缓慢。就像,当我按住它时,它非常笨拙。经过进一步检查,我发现密钥重复间隔为 0.1 秒,这是在我的系统偏好设置中设置的。这意味着它正在跳帧。但是,在游戏中,我不希望此设置影响运动。那么如何在不被按键重复间隔阻止的情况下检测到按键持有事件

【问题讨论】:

    标签: macos keyboard nsevent macos-high-sierra


    【解决方案1】:

    您应该忽略按键重复事件(isARepeat true)。相反,当您收到按键事件时,请启动一个计时器,该计时器会触发您想要提升游戏状态的频率。在该计时器的触发代码中推进游戏状态。当您收到按键事件时,停止计时器。

    【讨论】:

    • 我实际上已经想到了这种技术,但我认为会有一种更简单的方法,它不在 NSEvent 文档中。但如果这是唯一的方法,我会去的。谢谢。
    • 不客气。当你这样做时,你可能应该根据事件的关键代码而不是字符来采取行动。例如,您想“向前移动”最上面一行字母中从左数第二个的键,不一定是产生“w”字符的键,它可能位于具有不同键盘布局的不同位置。无论键盘布局产生什么字母,该键都有keyCodekVK_ANSI_W
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2011-09-14
    • 2017-12-05
    • 2019-09-14
    • 2014-05-20
    相关资源
    最近更新 更多