繁体   English   中英

在场景的update()外部更新SKNode

[英]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表添加(或删除)到数组。

虽然绝对有可能在每一帧中搜索整个场景图,但从性能的角度来看这将是非常糟糕的。

这是正确的方法吗?

我个人不喜欢在我的SKNodeSKSpriteNode子类中编写这种代码。

我通常创建一个Logic类。 此类是从GameScene接收update事件的类。 它还接收其他“逻辑事件”,例如:

  1. gameStarted
  2. touchesBegan
  3. touchesEnded

此类包含游戏纯粹游戏逻辑

就像在棋盘游戏中可以找到的《 使用手册》一样,它完全与游戏实体的图形表示无关。

在理想情况下,我将能够从我的SpriteKit游戏中提取Logic类,并将其与其他框架甚至同一游戏的(非电子)棋盘游戏版本一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM