是否可以将SKSpriteNode添加到另一个类的场景中?

时间:2016-09-14 22:42:14

标签: swift sprite-kit swift2 skspritenode skscene

是否可以将SKSpriteNode添加到另一个类的场景中?

*这些是例子

所以我有一个带有自定义类的SKScene ..

class MainMenu: SKScene {

   code...

}

另一个带有自定义类的SKScene ..

class GameOver: SKScene {

   code...

}

我有另一个名为PopupMenu的课程......

class PopupMenu: SKScene {

    func addSprite() {

    theSprite = SKSpriteNode.init(imageNamed: "theImage")
    theSprite.position = CGPointMake(self.frame.width/2, self.frame.height/2)
    theSprite.zPosition = 2

    self.addChild(theSprite)

}

所以我想要实现的是能够单击MainMenu场景和GameOver场景上的节目菜单按钮,并能够从PopupMenu调用该函数将该节点添加到相应的场景。

我可以通过在每个Scene Class中编写弹出窗口的代码来实现这一点,但我觉得这不是在可重用性方面做到这一点的最佳方法。

有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

查看SKReferenceNodes,您可以通过SpriteKit Scene Builder创建弹出菜单,然后将其保存为sks文件。当需要使用它时,您只需拉出弹出菜单的文件,然后将其添加到场景中。

来源:https://developer.apple.com/reference/spritekit/skreferencenode

如果您计划不使用SKS Builder(我建议使用它因为它真棒且节省大量时间),您可以做的另一件事是将弹出菜单子类化为SKSpriteNode,而不是场景

class PopupMenu: SKSpriteNode {

    required init?(coder: aDecoder:NScoder) {
        super.init(coder:aDecoder)    
    }    

    override init(texture: SKTexture!, color: SKColor!, size: CGSize) {
        super.init(texture: texture, color: color, size: size) {
    }

    convenience init() {
        self.init(imageNamed: "theImage")
        self.zPosition = 2    
    }


}

然后在你的场景代码中,只需调用

let popup = PopupMenu()
popup.position = CGPointMake(self.frame.width/2, self.frame.height/2)
self.addChild(popup)

答案 1 :(得分:3)

如果您希望您的游戏运行良好,首先要做的是确保当您传递到新场景时,前一个场景将被解除分配。 我认为你可以为自定义类构建一个通用菜单或一个通用菜单按钮,并在任何你想要的地方调用它:

class MenuButton : SKSpriteNode
{
    var length: CGFloat!

    override init(texture: SKTexture!, color: SKColor!, size: CGSize) {
        self.length = 50 // default lenght
        super.init(texture: texture, color: color, size: size)
    }

    convenience init(color: SKColor, length: CGFloat = 50) {
        var size = CGSize(width: length, height: length);
        self.init(texture:nil, color: color, size: size)
        self.length = length
    }

    required init?(coder aDecoder: NSCoder) {
        // Decoding length here would be nice...
        super.init(coder: aDecoder)
    }
}