之前写了一个打飞机的游戏,在飞机子弹的问题上,走过很多坑。下面就简单介绍几种方案:
1.需要时生成。做一个action序列,间隔一定时间发射一个或者一组子弹,发射的时候用纹理初始化成精灵节点,然后附加到一个子弹组的sknode上。超出边界的时候,自动把自己从父节点移除。这是我最开始采用的方案,但是因为子弹需要设置的属性很多,包括物理边界、碰撞检测等,所以当间隔时间小于0.15秒左右时,很可能导致crash。这种方法适合生成敌人,或者一些间隔时间长的对象。
伪代码:
bullets.runAction(SKAction.repeatActionForever(SKAction.sequence[SKAction.waitForDuration(0.5),SKAction.runBlock({
var bullet = SKSpriteNode(...)
...
self.bullets.addChild(bullet)
})]))
2.需要时拷贝。看了几个别人写的demo和git上的项目,发现这样写的不多,做iOS两年经验的同学也不赞成这种方式。不过还是有人这样写,于是我就尝试了一下,先建立一个标准的bullet作为样板,然后每次需要新子弹,就调用bullet模板的copy函数,拷贝一份。我试验了一下,速度快了很多,如果没记错的话,大概间隔可以缩小到0.1秒以内了,0.05左右还是可以的。但是还是伴随着大量的初始化和销毁操作,实在不是太好的解决方式。
伪代码:
var bullet = SKSpriteNode()SKSpriteNode
...
bullets.runAction(SKAction.repeatActionForever(SKAction.sequence[SKAction.waitForDuration(0.5),SKAction.runBlock({
self.bullets.addChild(bullet.copy() as SKSpriteNode)
})]))
SKSpriteNode
3.也就是我的最终方案了,预先生成一定数量的子弹,然后复用。我在场景初始化时,就生成好了30个子弹放在bulletGroup这个数组里,然后逐个add到bullets这个SKNode节点下,子弹超出边界时,remove掉,但是因为有bulletGroup数组的引用,子弹并不会消失,可以进入下一次复用。add的时候,只需要调整一下子弹的position就可以了,连子弹飞行的action都不需要改动。这个目前我没有测试到子弹间隔时间的极限,0.01秒应该是毫无问题的。
抱歉,涉及代码比较多,就不附加伪代码了,思路很清楚,很好实现。不过归根结底,用哪种方案还是要看是哪种需求。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。