本文探讨一下 Cocos2d-x关于物理引擎碰撞和接触设置问题;Box2d和Cocos2d-x 3.2自带的物理引擎都适用。
碰撞设置的三个函数:
(1) setGroup(1);
1. 用body调用是设置这个body上所有的shape;shape上调用,是设置单个shape;
2. 同组,总是相碰;不管后面的掩码怎么设置;
3. 不同组,相不相碰要看掩码; 优先级高于碰撞掩码;
1
2
|
sp2->getPhysicsBody()->setGroup(1);
sp3->getPhysicsBody()->setGroup(2);
|
(2)掩码三个函数; (检测碰撞和检测触发函数两个作用);
默认情况,这3个都设置成FF;
1
2
3
|
sp3->getPhysicsBody()->setCategoryBitmask(0x01);//种类
sp3->getPhysicsBody()->setCollisionBitmask(0x02);//碰撞(不可穿透)
sp3->getPhysicsBody()->setContactTestBitmask(0x01);//接触(触发检测函数);
|
两个精灵: 0001&0010 为0; (只有1&1才是1);
1. 两种状态:碰撞(不可穿透)和接触(触发检测函数);
2. 运算; 要算碰撞;碰撞值和对方的种类值运算跟接触无关; 要算接触,接触价和对方的种类值运算;
3. 种类设置成0;和任何都没碰撞,跑出边界外;
4. 种类与碰撞:1碰撞,0不碰撞; 如:种类01,碰撞02;结果不碰撞;
5. 种类与接触:1触发碰撞检测,如:种类01, 接触02;结果不检测;
(3)两个精灵设置成不同的;
A的种类与B的碰撞;B的种类与A的碰撞;只要有一个不为1就不会碰撞;
如:
1
2
3
4
|
A->setCategoryBitmask(1);//种类
A->setCollisionBitmask(5);//碰撞
B->setCategoryBitmask(1);//种类
B->setCollisionBitmask(2);//碰撞
|
A的种类与B的接触;B的种类与A的接触;只要有一个不为1就不会检测;
1
2
3
4
|
A->setCategoryBitmask(5);//种类
A->setContactTestBitmask(1);//接触
B->setCategoryBitmask(2);//种类
B->setContactTestBitmask(4);//接触
|
(4)使用技巧:
一般使用2的N次方的数,种类会少些;设成相同的就碰撞或接触;
1.不想碰撞;碰撞值设成一个2的N次方的数,其它的比它小就行;
1
2
3
|
shape1->setCategoryBitmask(2);//种类
shape1->setCollisionBitmask(64);//碰撞
shap1->setContactTestBitmask(8);//接触
|
2.不想接触; 接触值设成一个2的N次方的数,其它的比它小就行;
1
2
3
|
shape2->setCategoryBitmask(2);//种类
shape2->setCollisionBitmask(8);//碰撞
shape2->setContactTestBitmask(64);//接触
|
3.要碰撞;直接对调两个SHAPE的种类值和碰撞值;多个不同shape的时候非常有用; 接触也是一样;
例:A类精灵有两个SHAPE; B类精灵有两个SHAPE;A1只和B2碰撞;B1只和A2碰撞; 其它的都不碰撞;
1)A类的精灵之间,精灵里的SHAPE间不碰撞,就用不同的2的N次方的数;
1
2
3
|
shapeA1->setCategoryBitmask(2);//种类
shapeA1->setCollisionBitmask(4);//碰撞
shapeA1->setContactTestBitmask(64);//接触
|
1
2
3
|
shapeA2->setCategoryBitmask(16);//种类
shapeA2->setCollisionBitmask(8);//碰撞
shapeA2->setContactTestBitmask(64);//接触
|
2) 直接对调两个SHAPE的种类值和碰撞值; A1只和B2; B1只和A2
1
2
3
|
shapeB1->setCategoryBitmask(8);//种类
shapeB1->setCollisionBitmask(16);//碰撞
shapeB1->setContactTestBitmask(64);//接触
|
1
2
3
|
shapeB2->setCategoryBitmask(4);//种类
shapeB2->setCollisionBitmask(2);//碰撞
shapeB2->setContactTestBitmask(64);//接触
|