使用带有SpriteKit的NSButton

时间:2014-06-26 08:49:29

标签: macos cocoa swift

我是一名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
@IBAction func buttonAction(sender: AnyObject) {
   GameScene().removeSprites()
    }

但是这次没有删除精灵并且println报告

<SKScene> name:'(null)' frame:{{0, 0}, {1, 1}}

所以我对这个'其他'SKScene感到困惑。

如何编写NSButton以实现精灵?

1 个答案:

答案 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()
}