Swift 是否可以从另一个类向场景添加SKSpriteNode?

Swift 是否可以从另一个类向场景添加SKSpriteNode?,swift,sprite-kit,swift2,skspritenode,skscene,Swift,Sprite Kit,Swift2,Skspritenode,Skscene,是否可以从另一个类向场景添加SKSpriteNode *这些都是例子 所以我有一个自定义类的场景 class MainMenu: SKScene { code... } class GameOver: SKScene { code... } 还有一个自定义类的场景 class MainMenu: SKScene { code... } class GameOver: SKScene { code... } 我还有一门课叫弹出菜单 class Pop

是否可以从另一个类向场景添加SKSpriteNode

*这些都是例子

所以我有一个自定义类的场景

class MainMenu: SKScene {

   code...

}
class GameOver: SKScene {

   code...

}
还有一个自定义类的场景

class MainMenu: SKScene {

   code...

}
class GameOver: SKScene {

   code...

}
我还有一门课叫弹出菜单

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)

}
因此,我试图实现的是能够单击主菜单场景和GameOver场景上的show menu(显示菜单)按钮,并能够从PopupMenu(弹出菜单)调用函数,将该节点添加到相应的场景中

我可以通过为每个场景类中的弹出窗口编写代码来实现这一点,但我觉得从可重用性的角度来看,这并不是最好的方法


有更好的方法吗

如果你想让你的游戏运行良好,首先要做的是确保当你进入一个新场景时,前一个场景被取消分配。 我认为您可以为自定义类构造一个公共菜单或公共菜单按钮,并在任何地方调用它:

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)
    }
}

如果你想让你的游戏运行良好,首先要做的是确保当你进入一个新场景时,前一个场景被释放。 我认为您可以为自定义类构造一个公共菜单或公共菜单按钮,并在任何地方调用它:

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)
    }
}

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

资料来源:

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

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)

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

资料来源:

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

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)


这很有趣,我从来没有这样做过,但如果我这样做了,那它会如何工作呢?如果它只是一个sks文件,那么菜单工作的代码来自哪里?。。。其他代码都在同一个地方,你在SKS builderI的场景中设置了自定义类字段,我不知道,因为我只使用了SpriteKit游戏的代码。我不使用SKS生成器,因为它在Xcode 7上有很多问题。它会清除我的节点,有时会在我保存的情况下删除所有内容。这毫无意义,这允许您在任何场景中使用相同的节点,您是否反对编写
addChild(SKReferenceNode(…)
或其他内容,因为这是您唯一要编写的代码,以使弹出菜单代码与场景一起工作,您在弹出菜单类代码中调用祖父母(祖父母,因为父节点是引用节点),这很有趣,我从来没有这样做过,但是如果我这样做,那么它将如何工作呢?如果它只是一个sks文件,那么菜单工作的代码来自哪里?。。。其他代码都在同一个地方,你在SKS builderI的场景中设置了自定义类字段,我不知道,因为我只使用了SpriteKit游戏的代码。我不使用SKS生成器,因为它在Xcode 7上有很多问题。它会清除我的节点,有时会在我保存的情况下删除所有内容。这毫无意义,这允许您在任何场景中使用相同的节点,您是否反对编写
addChild(SKReferenceNode(…)
或其他内容,因为这是您唯一要编写的代码,以使弹出菜单代码与场景一起工作,您可以在弹出菜单类代码中调用祖父母(祖父母,因为父节点是引用节点)。我的意思是,您可以为MenuButton创建一个自定义类(一个新文件),继承SKSpriteNode方法,因此下次需要自定义按钮时,只需调用let myBtn=MenuButton.init(…)@AlessandroOrnano,我不确定这是否回答了这个问题。您只是在讨论如何检查代码以确保解除分配,并展示关于如何进行重新分配的代码subclass@Knight0fDragon你在开玩笑吧?这是一种自然的定制方式,有几种方式,这是其中之一。我来这里不是为了做佣金方面的工作,而是提供建议和说明找到正确方法的方法。你的回答是我不喜欢的另一种方法,因为我认为这不像裸体代码那样容易进行深层定制,但它可以工作。问题是“如何将一个SKSpriteNode添加到另一个类的场景中?”你在什么时候回答这个问题question@AlessandroOrnano,SKReferenceNodes提供尽可能多的定制,所以不知道你是从哪里得到这个想法的。我的意思是,你可以为你的MenuButton创建一个自定义类(一个新文件)来继承SKSpriteNode方法,所以下次你想要自定义按钮时,只需调用let myBtn=MenuButton.init(…)@AlessandroOrnano,我不确定这是否回答了这个问题。您只是在讨论如何检查代码以确保解除分配,并展示关于如何进行重新分配的代码subclass@Knight0fDragon你在开玩笑吧?这是一种自然的定制方式,有几种方式,这是其中之一。我来这里不是为了做佣金方面的工作,而是提供建议和说明找到正确方法的方法。你的回答是我不喜欢的另一种方法,因为我认为这不像裸体代码那样容易进行深层定制,但它可以工作。问题是“如何将一个SKSpriteNode添加到另一个类的场景中?”你在什么时候回答这个问题question@AlessandroOrnano,SKReferenceNode