不为 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
,但这对我的情况没有帮助。有什么建议吗?
我的天...我找到了一个简单的解决方案,我当然不知道我以前怎么没有想到它。
由于 GameScene
的 keyDown
方法实际被调用,我只是从那里调用精灵的 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)
}
}
而且它不需要我覆盖任何变量(我猜它默认设置为第一响应者 - 如果这是错误的请纠正我)。
当我 运行 遇到问题时,我正在做一个小游戏。为了找出问题,我做了一个小测试项目。
我有以下 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
,但这对我的情况没有帮助。有什么建议吗?
我的天...我找到了一个简单的解决方案,我当然不知道我以前怎么没有想到它。
由于 GameScene
的 keyDown
方法实际被调用,我只是从那里调用精灵的 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)
}
}
而且它不需要我覆盖任何变量(我猜它默认设置为第一响应者 - 如果这是错误的请纠正我)。