原文地址:http://blog.sina.com.cn/s/blog_6a2061a20100n0or.html

碰撞筛选就是一个防止某些形状发生碰撞的系统。按照具体需求设置哪些物体跟那些物体发生碰撞,跟哪些物体不发生碰撞。
Box2D通过种群跟组索引支持碰撞筛选。
组索引比较简单,设置其shapeDef的groupIndex值即可,例如boxDef.filter.groupIndex = 1。
通过groupIndex值的正负来确定同一个组的所有形状总是发生碰撞(正)或永远不发生碰撞(负),需要特别注意的是两个不同的付索引是依然会发生碰撞的,例如一个圆的GroupIndex值为-1,一个矩形GroupIndex值为-2。因为不同组索引之间是按照种群跟掩码来筛选的,也就是讲,组索引是有着更高的优选权的。

Box2D支持16个种群,因此我们可以指定任何一个形状属于哪个种群,同时也可以指定这一形状和哪些其它的种群发生碰撞。这一过程就是通过设置其shapeDef的categoryBits值与maskBits值完成的。
categoryBits用于定义自己所属的碰撞种类,maskBits则是指定碰撞种类。
举个例子讲,如果body1的boxDef.filter.categoryBits = 0x0002,body2的boxDef.filter.categoryBits = 0x0004,则如果另外一个body想与他们两个都发生碰撞,则其boxDef.filter.maskBits = 0x0006;简单讲,一个body要与其它种群的body发生碰撞,则其maskBits值应该为其它种群的body的categoryBits之和。

但是同时也不是那么简单,如果三个body的categoryBits分别为0x0001,0x0002,0x0003,那另外一个body的 maskBits值如果是0x0003的话,那它是跟categoryBits值为0x0001和0x0002的两个body碰撞呢,还是单独只跟 categoryBits值0x0003的body发生碰撞呢,亦或是跟三个body都发生碰撞呢?

一个游戏中的种群一般有多少种呢?

现在我们就做一个测试,具体要求:四个刚体。
矩形:只跟自身,圆形,三角形发生碰撞。
圆形:只跟自身,矩形,五边形发生碰撞。
三角形:只跟自身,矩形发生碰撞。
五边形:只跟自身,圆形碰撞。

categoryBits值:矩形[0x0001],圆形[0x0002],三角形[0x0003],五边形[0x0004]。
maskBits值:矩形[1+2+3=6=0x0006]
            圆形[1+2+4=7=0x0007]
            三角形[1+3=4=0x0004]
            五边形[2+4=6=0x0006]
这个碰撞具体会怎样呢?矩形跟五边形竟然一样!6跟7少说也有两种组合方法,还是直接看Demo好了。

结果:
矩形:只跟圆形发生碰撞。6跟2有什么关系?
圆形:只跟自身,矩形,五边形发生碰撞。符合要求。赞一个!
三角形:只跟五边形发生碰撞。4跟4,是不是单一比组合优先?
五边形:只跟自身,圆形,三角形发生碰撞。6 = 2+3+4??我勒个去!

还是先看看正确的把!

一切一切的错误就是categoryBits值有些取值是违规的,categoryBits值是必须为2的倍数的。

即有如下的16个种群:

0x0000 = 0

0x0001 = 1

0x0002 = 2

0x0004 = 4

0x0008 = 8

0x0010 = 16

0x0020 = 32

0x0040 = 64

0x0080 = 128

0x0100 = 256

0x0200 = 512

0x0400 = 1024

0x0800 = 2048

0x1000 = 4096

0x2000 = 8192

0x4000 = 16384

0x8000 = 32768

这样子,6就只能跟2+4配对,8就只能跟8自己配对。

Box2dの碰撞筛选[Ispooky]相关推荐

  1. Box2D C++ 教程-碰撞剖析

    声明:本教程翻译自:Box 2D C++ turorials - Anatomy of a collision,仅供学习参考. 在Box2D中,经常会遇到物体之间的碰撞问题,当一个碰撞发生时,就是利用 ...

  2. Box2D C++ 碰撞

    ----我的生活,我的点点滴滴!! 在Box2D中,经常会遇到物体之间的碰撞问题,当一个碰撞发生时,就是利用定制器(fixtures)用来做碰撞检测的.碰撞可以以很多 方式进行,我们可以在碰撞过程中获 ...

  3. Cocos2d之Box2d基础知识

    一.box2d基础知识 1.关于 Box2D 是一个用于游戏的 2D 刚体仿真库.从游戏的视角来看,物理引擎就是一个程序性动画(procedural animation)的系统,而不是由动画师去移动你 ...

  4. Cocos2d-X Box2D内容讲解

    一.box2d基础知识 1.关于 Box2D 是一个用于游戏的 2D 刚体仿真库.从游戏的视角来看,物理引擎就是一个程序性动画(procedural animation)的系统,而不是由动画师去移动你 ...

  5. Box2D物理引擎入门

    一.什么是Box2D Box2D是一个强大的开源物理游戏引擎,用来模拟2D刚体物体运动和碰撞,由Erin Catto早在2007年用C++语言开发. Box2D集成了大量的物理力学和运动学的计算,并将 ...

  6. Box2D v2.1.0用户手册翻译 - 第06章 夹具(Fixtures)

    原文地址:http://blog.csdn.net/complex_ok/article/details/6719936 [-] 内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0 ...

  7. Box2D一:基础知识

    一.box2d基础知识 1.关于 Box2D 是一个用于游戏的 2D 刚体仿真库.从游戏的视角来看,物理引擎就是一个程序性动画(procedural animation)的系统,而不是由动画师去移动你 ...

  8. Box2D v2.1.0用户手册翻译 - 第09章 接触(Contacts)

    内容很多摘自 Aman JIANG(江超宇)翻译的Box2D v2.0.1 用户手册 第09章 接触(Contacts) 9.1 关于 接触(contact)是由 Box2D 创建的用于管理fixtu ...

  9. Box2D教程5-碰撞检测

    Box2D教程1-创建碰撞世界 Box2D教程2-鼠标交互 Box2D教程3-刚体绑定外观 Box2D教程4-复杂刚体的复杂外观 Box2D教程5-碰撞检测 之前我们已经了解了如何通过Box2D创建一 ...

最新文章

  1. golang 的AES加解密 (CBC/ECB/CFB 模式)
  2. ruby(wrong number of arguments (1 for 2) )
  3. Ubuntu中update-alternatives命令(版本切换)
  4. 安装ie9提示未能完成安装_IE9浏览器无法安装怎么办?如何解决?
  5. word2vec应用场景_介绍Word2Vec和Glove这两种最流行的词嵌入方法背后的直觉
  6. 最实用的18个HTML5 API 教程大全,都在这里了
  7. 数据库逻辑删除的sql语句_SQL查询优化的数据库设计和逻辑断言
  8. 使用IDEA在Maven中创建MyBatis逆向工程以及需要注意的问题(入门)
  9. 全局变量的使用和声明
  10. 转 json数组对象和对象数组
  11. 【MySQL】MySQL的安装(免费社区版)
  12. hibernate四种状态
  13. 中国游戏企业扬帆出海,应该选择怎样的云平台?
  14. python制作电脑软件_python制作一个桌面便签软件 -电脑资料
  15. java实现微信公众号token验证
  16. qmp32下载_U盘歌曲播放顺序调整教程
  17. 怎么做视频特效?不妨试试抖音特效创作平台
  18. Proteus和Keil两个软件的联合使用
  19. 26个字母的爱情含义!
  20. 一言不合就想斗图?快用深度学习帮你生成表情包

热门文章

  1. 有人问我为什么不买iphon12,我为什么要买iphone12 pro max
  2. 如何看待药物治疗过程中的副作用?
  3. 1998ieee圆周率c语言,华人留学生开发首个古汉语编程语言,实现易经算命、圆周率计算,Github获赞14.7k...
  4. 【原创】被误解的匈牙利命名法
  5. 网络模拟器软件分享——Cisco Packet Tracer、华为eNSP、H3C Cloud Lab
  6. 阿里云DNS服务器免费版和付费版列表
  7. 根据手机指南针经纬度在地图上找到其位置
  8. python多线程图片处理
  9. uni-app是什么有啥子用?
  10. 三极管基础分类, 参数选择及常见型号对比