~~~~我的生活,我的点点滴滴!!
下面的内容没有展示任何代码,其实代码蛮简单的,只是说了一些解决情况。
除非你正在完成一个最基本地游戏,否则很有可能你会在游戏进行的某一时刻删除一些物体。比如说当玩家杀死一个敌人后,所发出
的子弹需要被清除掉,还比如说两个物体发生碰撞其中一个完全毁坏,等等很多此类的例子。在代码中移除一个物体简单的令人发指
只要调用world->DestroyBody(b2Body*),如果进行删除操作期间没有对此物体发生调用,那么整个删除操作就完成了。问题经常出现
在删除物体的同一个时间步长内发生对此物体的调用,通常是一个碰撞回调。如果我们回想一下之前碰撞回调的方法,我们会发现不
能在碰撞回调内部删除物体,因为此时world正好运行在同一个物理步长中,此时被删除的物体还处于运行期间,这么做不是一个好
的办法。
如果你使用线程或者计时器(timers)来移除物体的话,会经常碰到类似的情况,比如说你想在游戏中某个事件发生后的几秒钟删除
一个物体。如果计时器执行删除的时候world当中的执行步长还在运行当中,也会引起类似的问题。
解决方案其实很简单。当你获取一个需要移除某个物体的碰撞回调的时候,只要把物体添加到一个自定义的物体删除链表当中,在此
时间步长执行完之后整体进行删除就行了。这个就像前面cocos2dx游戏中写的一个三消游戏“寿司消除”,当时也是把需要删除的物
体单独用一个链表存起来了,统一删除!虽然和这里面说的情况有点不一样,但是思想还是通用的。还有一个问题是:我们的碰撞回
调中只是把要删除的物体添加进了链表中,那么到底是什么时候删除了?在Box2D中的每一帧刷新处删除,即在Step()函数中。
使用线程或者计时进行移除物体方法也是类似的,只要把所有需要移除的物体放到一个链表中,当你确定world的执行步长运行结束的
时候就可以整体处理它们。一个简单的方法也可以在游戏循环(例如,60fps速率下2秒等于120次的步长调用)中进行’定时移除’,
在实体中设置一个值,然后每一帧减少一直到变为零,然后移除它。
顺便说一下,虽然这个话题专门说了下移除物体,但是这个地方经常引起一些问题,信物体的创建,添加和移除定制器必须用这种方法
进行处理。