有一小段时间,游戏总是在重新开始的时候崩溃掉。追了很久总算发现了原因:是游戏结束之后,场景清理不干净,导致游戏资源未释放或者重复赋值。游戏场景清理,是很多初学spritekit的小伙伴经常遇到的问题,到底怎么清理比较好比较放心呢?经过这段时间的学习,我个人一般使用两种方式。
第一种:将之前的旧场景置空。场景是由ViewController控制的,ViewController通过调用自己的root view as SKView,转为SKView,之后进行一些简单的配置,然后在presentScene一下,把初始化之后的场景展示出来。当你需要重新开始游戏的时候,调用presentScene传入nil,因为每个skview只能挂载一个场景(可以通过skview.scene?取出来),所以旧的场景会被取消引用。
第二种:场景复用。游戏结束时,只要生成一个结束的view,覆盖上场景即可(以目前的开发经验,推测场景会被放置在最底层的view里,任何skview的subview都会在scene之上)。玩家点击重新开始时,不需要做场景清理和重新初始化,只要将各个组件的位置和action重新赋值一遍即可,如果场景很大的话,重新开始速度会非常快,但是需要重置的child也越多,所以还是要根据具体游戏大小和需求,来确定使用何种方式。

我遇到的就是第二种情况:开发的时候,只清理了根节点self的所有action和child,比如在场景类里定义了一个enemy的sknode,下面挂载所有敌人精灵。清理的时候,只是把enemy进行了removeFromParent操作,之后又重新对它赋值了一遍。这是不对的,或者将它置空,然后重新赋值,然后add到self上,或者不需要重新赋值,直接add到self上就又可以用了。removeFromParent只是将子节点从父节点移除,却并不会销毁它。


敲键盘的猫
772 声望131 粉丝

一只热爱科技的猫