用刚体isSensor属性创建感应区域

作者: ladeng6666 分类: Box2D 发布时间: 2012-10-28 19:56 阅读: 8,741

Box2D是一个强大的2D物理引擎,可以帮我们完美实现2D物理碰撞。前面学习了各种刚体和关节对象,以及它们的检测碰撞,充分证明了Box2D是一个强大而完美的2D物理引擎。

默认情况下,碰撞发生后,Box2D会按照动量守恒定律,自动模拟物理碰撞的反弹或变向运动。但是有时候,根据碰撞后处理方式的不同,碰撞后的动量守恒运动可能并不是我们想要的。比如,当碰撞后改变刚体重力方向,这时候被碰撞的刚体更像是一个感应区域。

如下面的示例,点击舞台空白处,创建矩形刚体,当矩形刚体与大圆发生碰撞后,会变更重力方向,变更后的重力始终指向小圆。

是不是很酷?有点像太空版的愤怒的小鸟的效果吧!哇咔咔!

效果实现的关键部分是,设置刚体的isSensor属性,决定刚体是否参与物理模拟。isSensor是一个boolean值,它的作用是:

  • 当isSensor为false时(这也是默认值),在发生碰撞后,由Box2D模拟物理碰撞后的反弹或变向运动。
  • 当isSensor是true时,刚体只进行碰撞检测,而不模拟碰撞后的物理运动。此时,我们就可以自定义刚体处理方式了,如示例中的绕小圆运动。

完整的代码和注释如下:

文档类:SensorTest.as

自定义的碰撞事件侦听类MyContactListener.as

 在SensorTest类中

第60~63行:将大圆的isSensor属性设置为false,则它不会进行物理碰撞模拟,只侦听碰撞事件。

第73行:自定义SensorBody的碰撞事件处理函数,我在自定义Box2D刚体碰撞处理函数中讲过这个用法。

第76~80行:当碰撞发生后,标示矩形刚体的changeGravity为true,这样在loop函数中可以实时更新它的重力,始终指向小的圆形刚体

第85~103行:实时更新刚体的自定义重力,这里用到了我在Box2D自定义重力中讲过的知识点。其中还用到了很多向量的只是,我在向量基础里曾经讲过,其实并不难,看看基础就能明白。

在MyContactListener类中

我创建了一个自定义的MyContactListener(b2ContactListener的子类),来侦听并处理碰撞事件。具体用法详见我的教程自定义Box2D刚体碰撞处理函数

完整的源文件下载地址

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

10条评论
  • Samuel_xin

    2012 年 10 月 30 日 下午 5:19

    晕,怎么我完全按照你的步骤做却不行的呢??到底哪里出问题了

    1. ladeng6666

      2012 年 10 月 30 日 下午 6:42

      有问题给我发邮件吧,我的邮箱是ladeng6666@163.com

      1. Samuel_xin

        2012 年 10 月 30 日 下午 9:57

        问题找到了,谢谢哈…

  • vpen

    2012 年 11 月 1 日 下午 2:09

    感谢拉登叔,又在这学到东西了。

    1. ladeng6666

      2012 年 11 月 1 日 下午 6:53

      感谢你一直以来的支持!

  • louis vuitton handbags outlet

    2012 年 11 月 20 日 上午 12:50

    This can be a excellent web site post, im pleased I discovered it. Ill be back down the monitor to look at various other blogposts in which

  • 一一遥遥

    2012 年 11 月 30 日 下午 4:08

    您乃神人也…..对我的毕业设计很有帮助。。
    强烈围观!!!!!!!!

  • Pingback: box2d 中b2Body的isSensor用法 | 移动开发(database.riaos.com)
  • Pingback: P2中的形状(上) - Ladeng6666
  • yweizj

    2015 年 10 月 15 日 下午 12:10

    源代码的下载链接无效了,能否重新发一个,谢谢!

发表评论

电子邮件地址不会被公开。 必填项已用*标注