我是一名tyro Cocoa程序员,试图通过修改默认的OS X代码来学习Swift / Cocoa / SpriteKit。所以这可能是一个基本问题,但我无法找到解决方案。
我想添加一些功能来删除你用鼠标点击后获得的所有Spaceship精灵,所以我将这些方法添加到了class:GameScene。
override func keyDown(theEvent: NSEvent!) {
if (theEvent.characters) == "p" {
removeSprites()
}
}
func removeSprites() {
self.removeAllChildren()
println(self) // Here to track down my problem.
}
当我按'p'并且println(self)
告诉我self
时,它会起作用
<SKScene> name:'(null)' frame:{{0, 0}, {1024, 768}}
接下来,我在Interface Builder中的SKView中设置一个NSButton并将其连接到class: AppDelegate
@IBAction func buttonAction(sender: AnyObject) {
GameScene().removeSprites()
}
但是这次没有删除精灵并且println报告
<SKScene> name:'(null)' frame:{{0, 0}, {1, 1}}
所以我对这个'其他'SKScene感到困惑。
如何编写NSButton以实现精灵?
答案 0 :(得分:1)
GameScene()是你的类的一个新实例,而不是你自己在早期方法中引用的实例。
你的IBAction在AppDelegate中,而不是在GameScene中,所以你需要保持对场景的引用 - 如果你使用的是默认模板,应该在applicationDidFinishLaunching中引用它......等待作为一个属性,你可以在你的行动中说self.scene!.removeSprites()。
var scene: GameScene? = nil
func applicationDidFinishLaunching(aNotification: NSNotification?) {
if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
self.scene = scene
// ...
}
}
@IBAction func buttonAction(sender: AnyObject) {
self.scene!.removeSprites()
}