[英]Updating SKNodes outside update() of scene
我很惊讶SKScene类中的update方法实际上没有继承自SKNode。 对我来说,所有SKNode都能够进行更新似乎是合乎逻辑的(例如,在不再显示时将其从场景中删除)。 我认为这将有助于使实例分离为独立实体(没有依赖关系,没有意外行为)。如果仅在场景中保留更新,还有其他逻辑,请解释。
所以我想知道是否值得使用计时器(以1/60的时间间隔重复)向我的自定义SKNode添加自定义更新(甚至可能是将其添加到所有SKNode的扩展)。 但是,我想这会占用大量内存。 因此,我想问一下是否有“最佳实践”。 如果计时器在每个帧处触发,而不是强制它每秒触发60次,则可能会起作用。
SpriteKit具有明确定义的更新周期,每种更新(逻辑,物理,图形)都应在明确定义的时间范围内进行。
如果您真的想在节点内部编写更新逻辑,那么最好的解决方案是创建自己的update
方法,然后从GameScene
手动调用它。
让我们看一个(可能的)结构化方法
protocol Updatable: class {
func update(currentTime: NSTimeInterval)
}
class Player: SKSpriteNode, Updatable {
func update(currentTime: NSTimeInterval) {
// your logic goes here
}
}
class GameScene: SKScene {
private var updatables = [Updatable]()
override func didMoveToView(view: SKView) {
let player = Player()
updatables.append(player)
self.addChild(player)
}
override func update(currentTime: NSTimeInterval) {
updatables.forEach { $0.update(currentTime) }
}
}
如您所见,我正在使用
Updatables
数组。 当将新的Updatables
表添加(或删除)到场景图中时,还应注意将新的Updatables
表添加(或删除)到数组。虽然绝对有可能在每一帧中搜索整个场景图,但从性能的角度来看这将是非常糟糕的。
我个人不喜欢在我的SKNode
或SKSpriteNode
子类中编写这种代码。
我通常创建一个Logic
类。 此类是从GameScene接收update
事件的类。 它还接收其他“逻辑事件”,例如:
gameStarted
touchesBegan
touchesEnded
此类包含游戏的纯粹游戏逻辑 。
就像在棋盘游戏中可以找到的《 使用手册》一样,它完全与游戏实体的图形表示无关。
在理想情况下,我将能够从我的SpriteKit游戏中提取Logic
类,并将其与其他框架甚至同一游戏的(非电子)棋盘游戏版本一起使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.