未在SKScene中调用对象的Keydown

问题描述

遇到问题时,我正在做一个小游戏。为了解决问题,我做了一个小测试项目。

我有以下课程:

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 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
    
    }

}

如您所见,我在两个类中都有一个keyDown方法。我清楚地看到精灵(GameScene)向上移动,因此调用x中的那个。但是,我的keyDown类中的Sprite方法永远不会被调用。我已经在网上搜索了,但我真正发现的唯一答案是必须重写acceptsFirstResponder并返回true,但这对我来说没有帮助。有什么建议吗?

解决方法

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

由于实际上已调用了GameScene的{​​{1}}方法,因此我只是从那里调用了sprite的keyDown方法并传递了参数:

keyDown

它并不需要我覆盖任何变量(我想默认情况下它设置为第一响应者-如果这是错误的,请更正我)。