问题描述
遇到问题时,我正在做一个小游戏。为了解决问题,我做了一个小测试项目。
我有以下课程:
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
它并不需要我覆盖任何变量(我想默认情况下它设置为第一响应者-如果这是错误的,请更正我)。