不为 SKScene 内的对象调用 Keydown

Keydown not called for objects inside an SKScene

当我 运行 遇到问题时,我正在做一个小游戏。为了找出问题,我做了一个小测试项目。

我有以下 class:

class Sprite: SKSpriteNode {

    override var acceptsFirstResponder: Bool { get { return true } }

    init() {
        super.init(texture: nil, color: .blue, size: CGSize(width: 200, height: 100))
        isUserInteractionEnabled = true
    
    }

    override func keyDown(with event: NSEvent) {
    
        position.x += 100
    
        print("keydown")
    
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

我在以下场景中创建了这个 class 的实例:

class GameScene: SKScene {

    override var acceptsFirstResponder: Bool { get { return true } }

    let x = Sprite()

    override func didMove(to view: SKView) {
    
        anchorPoint = CGPoint(x: 0.5, y: 0.5)
    
        isUserInteractionEnabled = true
    
        addChild(x)
    
    }

    override func keyDown(with event: NSEvent) {
    
        x.position.y += 50
    
    }

}

如您所见,我在两个 class 中都有一个 keyDown 方法。 GameScene 中的那个被调用,因为我可以清楚地看到精灵 (x) 向上移动。但是,我的 Sprite class 中的 keyDown 方法永远不会被调用。我在网上搜索过,我真正找到的唯一答案是必须覆盖 acceptsFirstResponder 和 return true,但这对我的情况没有帮助。有什么建议吗?

我的天...我找到了一个简单的解决方案,我当然不知道我以前怎么没有想到它。

由于 GameScenekeyDown 方法实际被调用,我只是从那里调用精灵的 keyDown 方法并传递参数:

class GameScene: SKScene {

    let x = Sprite()

    override func didMove(to view: SKView) {

        anchorPoint = CGPoint(x: 0.5, y: 0.5)

        addChild(x)

    }

    override func keyDown(with event: NSEvent) {

        x.position.y += 50
        x.keyDown(with: event)

    }

}

而且它不需要我覆盖任何变量(我猜它默认设置为第一响应者 - 如果这是错误的请纠正我)。