按箭头键会在SpriteKit中产生增量跳跃

编程语言 2026-07-10

我在macOS(Sequoia)上的SpriteKit游戏遇到了一个问题:第一次按下箭头键时,帧时间增量会突然变大,形成一个尖刺。我用一个小程序测试过,代码如下:

//
//  GameScene.swift


import SpriteKit
import GameplayKit

class GameScene: SKScene {
    var lastTime: TimeInterval = 0

    override func keyDown(with event: NSEvent) {
            print("---------------> delta keyDown: \(event.characters!) keyCode: \(event.keyCode)")
    }

    override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendered
        print("update begins")

        let dt: CGFloat
        if lastTime > 0 {
            dt = (CGFloat(currentTime - lastTime))
        } else {
            dt = 1.0 / 60.0
        }
        if dt > (1/30) {
            print("************************************ delta spike ", dt)
        }
        lastTime = currentTime
        print("dt: ", dt)
        print("update ends")

    }
}

示例输出:

update begins
************************************ delta spike  0.03381687504588626
dt:  0.03381687504588626
update ends
update begins
dt:  0.016670208307914436
update ends

正如你所见,在这种情况下按下左箭头键时,会出现一个明显的时间增量尖刺。继续按箭头键时则不会再有尖刺。

其他键,例如游戏中常用的W A S D键,不会引起这个时间增量尖刺。

解决方案

问题已解决。在ViewController.swif的 viewDidLoad中添加了以下内容:

        NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in
            self.skView.scene?.keyDown(with: event)
            return nil }
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章