Box2D C++ 物体的安全删除

~~~~我的生活,我的点点滴滴!!



下面的内容没有展示任何代码,其实代码蛮简单的,只是说了一些解决情况。


除非你正在完成一个最基本地游戏,否则很有可能你会在游戏进行的某一时刻删除一些物体。比如说当玩家杀死一个敌人后,所发出

的子弹需要被清除掉,还比如说两个物体发生碰撞其中一个完全毁坏,等等很多此类的例子。在代码中移除一个物体简单的令人发指

只要调用world->DestroyBody(b2Body*),如果进行删除操作期间没有对此物体发生调用,那么整个删除操作就完成了。问题经常出现

在删除物体的同一个时间步长内发生对此物体的调用,通常是一个碰撞回调。如果我们回想一下之前碰撞回调的方法,我们会发现不

能在碰撞回调内部删除物体,因为此时world正好运行在同一个物理步长中,此时被删除的物体还处于运行期间,这么做不是一个好

的办法。






如果你使用线程或者计时器(timers)来移除物体的话,会经常碰到类似的情况,比如说你想在游戏中某个事件发生后的几秒钟删除

一个物体。如果计时器执行删除的时候world当中的执行步长还在运行当中,也会引起类似的问题。


解决方案其实很简单。当你获取一个需要移除某个物体的碰撞回调的时候,只要把物体添加到一个自定义的物体删除链表当中,在此

时间步长执行完之后整体进行删除就行了。这个就像前面cocos2dx游戏中写的一个三消游戏“寿司消除”,当时也是把需要删除的物

体单独用一个链表存起来了,统一删除!虽然和这里面说的情况有点不一样,但是思想还是通用的。还有一个问题是:我们的碰撞回

调中只是把要删除的物体添加进了链表中,那么到底是什么时候删除了?在Box2D中的每一帧刷新处删除,即在Step()函数中。


使用线程或者计时进行移除物体方法也是类似的,只要把所有需要移除的物体放到一个链表中,当你确定world的执行步长运行结束的

时候就可以整体处理它们。一个简单的方法也可以在游戏循环(例如,60fps速率下2秒等于120次的步长调用)中进行’定时移除’,

在实体中设置一个值,然后每一帧减少一直到变为零,然后移除它。


顺便说一下,虽然这个话题专门说了下移除物体,但是这个地方经常引起一些问题,信物体的创建,添加和移除定制器必须用这种方法

进行处理。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值