有没有办法在Sprite Kit中挂钩SKNode生命周期?具体来说,我想在节点从场景中删除时执行一些代码。
用例我想更详细地解决一下: 我有一些相互交互的节点,我希望他们收到发生在其他节点上的某些事件的通知。例如,想象一下您可以点击场景中的节点的游戏,节点的详细信息将显示在HUD上。当节点从场景中移除时,我希望HUD消失。 我打算使用NSNotificationCenter作为通知引擎。 每当节点从场景中删除时,我想发布通知。最简单的方法是绑定到SKNode上的生命周期方法(我的节点是SKSpriteNode的子类),如nodeWasRemovedFromParent,但我没有找到任何这样的方法。
如何做到这一点?
我通过覆盖SKSpriteNode子类中的removeFromParent方法并在调用超级实现之前发布通知,对编写自己的解决方案进行了一些思考。我不确定是否总会调用removeFromParent方法。例如,当我改变场景时它会被调用吗?
感谢。
答案 0 :(得分:4)
您需要子类化每个节点类。像你说的那样覆盖removeFromParent
方法。仅使用子类型,否则您的代码将不会生效。
此外,您需要覆盖removeAllChildren
和removeChildrenInArray:
,或者永远不要使用它们。
场景发生变化时,不会调用removeFromParent
方法。相反,覆盖场景的willMoveFromView:
方法并递归地向已注册的观察者或简单地向所有子节点发送消息。使用场景的枚举功能来执行此操作。请注意,我不是100%确定在willMoveFromView
场景中的孩子是否仍然附着,我认为他们会这样做。
不幸的是,不可能只是继承SKNode,然后期望子类的代码适用于所有其他节点类,因为这些子类直接来自SKNode而不是您的自定义SKNode子类。因此,如果您需要在删除时通知它,则需要将此代码子类化并添加到每个SK * Node子类中。
有关示例,请参阅KoboldKit节点类,该示例使用宏将此“覆盖”代码注入SK * Node子类,以避免重复代码。实际功能在KKNodeShared中:https://github.com/KoboldKit/KoboldKit/tree/master/KoboldKit/KoboldKitFree/Framework/Nodes/Framework