是否可以将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中编写弹出窗口的代码来实现这一点,但我觉得这不是在可重用性方面做到这一点的最佳方法。
有更好的方法吗?
答案 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)
}
}