整洁、干净地访问 SKNode

Posted

技术标签:

【中文标题】整洁、干净地访问 SKNode【英文标题】:Tidy, Clean Access To SKNodes 【发布时间】:2015-07-20 19:11:51 【问题描述】:

我正在尝试整理我的一些 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 子类中遗漏了一些简单的东西。

非常感谢,

【问题讨论】:

【参考方案1】:

如此接近,您只需要添加一个显式的self

class PauseMenu: SKNode

    lazy var lbBestTime: SKLabelNode = 
        self.childNodeWithName("lbPersonalBest") as! SKLabelNode

【讨论】:

【参考方案2】:

这里缺少的是self

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

在(惰性)属性初始化程序的上下文中,您不能隐含 self... 可能该初始化程序被视为闭包(即使它不需要大括号,如果它是单个语句) ,并且闭包总是需要清楚它们是否捕获self

如果你在你的问题中初始化layerPause,并且它的类型是SKNode,你仍然不能在它上面使用你新定义的lbBestTime属性——编译器知道的只是layerPauseSKNode。请务必告诉它layerPausePauseMenu,然后您就可以使用该类中的自定义属性。

【讨论】:

确实,我认为延迟初始化可能允许这些属性,但遗憾的是它没有。相反,我在类中添加了一个层变量,删除了子类,并通过初始化程序将节点传递给了类。感觉不是很优雅,但比以前有所改进

以上是关于整洁、干净地访问 SKNode的主要内容,如果未能解决你的问题,请参考以下文章

text 边框的速记属性干净整洁,但是使用此边框SCSS Mixin,您可以轻松地向一侧添加边框或

PHP CURL api 是不是比使用流进行 HTTP/HTTPS 访问更干净/更快/更好?

干净整洁的连续步骤 - 删除临时文件?

关于图片序列帧播放,干净整洁版

windows 下 创建项目的虚拟环境

保持 TYPO3 sys_log 干净整洁的最佳方法?