Cocos物理引擎刚体的3种掩码

来源:互联网 发布:淘宝详情页模板怎么做 编辑:程序博客网 时间:2024/06/07 04:54

在一些物理世界游戏的设计中,肯定会涉及到一些刚体的接触,那么这些刚体的接触我们是可以决定到底碰撞与否,接触的时候是否调用回调函数来进行一些处理,那么下面我们就来介绍一下刚体的3种掩码值。

  • 首先看下面3个函数

    triangle->getPhysicsBody()->setCategoryBitmask(0x08); // 1000
    这个函数是设置刚体的种类掩码值,掩码值最多可以用32位的2进制表示,所以掩码值得最大值是0xFFFFFFFF,这也是默认的掩码值,一般简单游戏用到8位我估计差不多了。
    triangle->getPhysicsBody()->setContactTestBitmask(0x02); // 0010
    这个函数设置刚体接触后的分组掩码值,干脆就叫做“接触掩码值”吧,这个值决定的是两个刚体接触后会不会产生一个物理代理(可以查看代理模式),其实简单点就是回调函数,产生这个回调函数大家就可以做很多接触代码处理。注意这个所谓的接触不是碰撞,两个物体会接触,但是不一定会碰撞,也就是接触后直接穿透了。默认值0x00000000.
    triangle->getPhysicsBody()->setCollisionBitmask(0x01); // 0001
    这里是设置碰撞掩码,也就是判断两个是直接穿透互不影响还是产生一个碰撞的过程,影响各自的速度,运动过程等。默认值0xffffffff。

  • 如何判断?
    上面解释函数的大概意思,那么到底怎么使用,系统如何判断是否碰撞或产生回调函数? 下面给大家举个例子:

triangle->getPhysicsBody()->setCategoryBitmask(0x08);    // 1000triangle->getPhysicsBody()->setContactTestBitmask(0x02); // 0010triangle->getPhysicsBody()->setCollisionBitmask(0x01);   // 0001box->getPhysicsBody()->setCategoryBitmask(0x02);    // 0010box->getPhysicsBody()->setContactTestBitmask(0x08); // 1000box->getPhysicsBody()->setCollisionBitmask(0x01);   // 0001

上面涉及到两种刚体,一个是方块,一个三角。那他们接触的时候会不会产生回调函数和碰撞过程?
1.回调函数:三角的接触掩码是0010,方块的类别掩码是0010,让他们做逻辑与运算为0010,结果是非0. 再看方块的接触掩码1000,三角类别掩码1000,逻辑与运算非0. 同时满足这两个条件,就可以产生回调函数。也就是将两种刚体的接触掩码分别与另外一个刚体的类别掩码做逻辑与运算,如果结果都是非0,那么可以响应回调函数。
2. 那么又要问了,怎么用这个回调函数,很简单,跟触摸监听器一下,下面代码:

auto contactListener = EventListenerPhysicsContact::create();    contactListener->onContactBegin = CC_CALLBACK_1(PhysicsContactTest::onContactBegin, this);    _eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);

onContactBegin大家只要重写这个函数就行了,很简单,具体可以看cocos3.7的Test CPP的PhysicsContactTest类。
3.产生碰撞过程,和上面的回调函数是一样的。三角的碰撞掩码是0001,方块的类别掩码是0010,让他们做逻辑与运算为0,结果是0. 看到这个就已经可以判断两个刚体接触不会产生碰撞了,总结就是将两种刚体的碰撞掩码分别与另外一个刚体的类别掩码做逻辑与运算,如果结果都是非0,那么可以产生碰撞。

0 0