整洁,干净的SKNodes访问

时间:2015-07-20 19:11:52

标签: swift sprite-kit sknode

我正在尝试整理一些我的SKScene代码。目前我有大约11个对SKNodes的引用(一些是包含子节点的层)。这些节点及其子节点经常被类访问。我考虑这样做的方式是:

将所有SKNode子类化为另一个类,例如,目前我在SKScene顶部定义了layerPause: SKNode?。这将成为layerPause: PauseMenu其中:

class PauseMenu: SKNode
{
lazy var lbBestTime: SKLabelNode = childNodeWithName("lbPersonalBest") as! SKLabelNode
}

然后,当场景加载时我可以简单地使用:

layerPause = pauseScene.childNodeWithName("pauseMenu")?.copy() as? SKNode

这样我就可以轻松访问重要的子节点,而无需一直调用childNodeWithName。但不幸的是,PauseMenu类给出了一个错误,说我不能使用childNodeWithName方法。

有人能指出我正确的方向吗?也许有一种更优雅的方式来管理我的节点,或者我可能在PauseMenu子类中缺少一些简单的东西,如上所述。

非常感谢,

2 个答案:

答案 0 :(得分:1)

如此接近,您只需要添加一个明确的self

class PauseMenu: SKNode
{
    lazy var lbBestTime: SKLabelNode = 
        self.childNodeWithName("lbPersonalBest") as! SKLabelNode
}

答案 1 :(得分:1)

此处缺少的是self

class PauseMenu: SKNode {
    lazy var lbBestTime: SKLabelNode = self.childNodeWithName("lbPersonalBest") as! SKLabelNode
}

在(懒惰)属性初始化程序的上下文中,您不能隐含self ...可能初始化程序被视为闭包(即使它不需要括号如果它是一个单一的陈述),关闭是否总是需要明确它们是否捕获self

如果您在问题中初始化layerPause,且其类型为SKNode,您仍然无法使用新定义的lbBestTime媒体资源但是,在它上面 - 所有编译器都知道layerPauseSKNode。请务必告诉layerPausePauseMenu,然后您可以使用该类中的自定义属性。