Cocos2d-x 3.2物理引擎:物理实体不完全接触

时间:2014-11-07 08:46:07

标签: cocos2d-x game-physics cocos2d-x-3.0

我是Cocos2d-x 3.2 Physic Engine的新手(正如Cocos2d-x所说,这个引擎基于Chipmuk)。 我制作了Popcap的“蛋射击”游戏样本。 当检测到2个鸡蛋的接触时,我遇到了一个问题,当接触事件被抛出时,动态的“蛋”似乎沉入静止的“蛋”。 我订了鸡蛋:

  • 质量:10.f
  • PHYSICSSHAPE_MATERIAL_DEFAULT
  • applyImpulse about(0,900)

这是图片:

enter image description here

检测接触球事件

auto contactBallListener = EventListenerPhysicsContact::create();
contactBallListener->onContactBegin = CC_CALLBACK_1(IngameScene::onContactBallsBegin, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactBallListener, this);
.....
bool IngameScene::onContactBallsBegin(PhysicsContact& contact)
{
   auto objA = contact.getShapeA()->getBody()->getNode();
   auto objB = contact.getShapeB()->getBody()->getNode();
}

物理设置

if (group == BallGroupTarget) {
    //Green ball
    body->setCategoryBitmask(0xFFFFFFF0);
    body->setContactTestBitmask(0x0000000F);
    body->setCollisionBitmask(0xFFFFFFFF);
} else if (group == BallGroupShooting){
    //Pink ball
    body->setContactTestBitmask(0xFFFFFFFF);
    body->setGravityEnable(false);
}

你能帮我解决这个问题吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

来自www.cocos2d-x.org

  

当一个主体的CategoryBitmask与另一个主体的ContactTestBitmask结果不等于零时,将发送联系事件,否则将不会发送联系事件。

     

当一个体的CategoryBitmask与另一个体的CollisionBitmask结果不等于零时,它们将合并,而不是。

     

您应该注意到,默认情况下,CategoryBitmask值为0xFFFFFFFF,ContactTestBitmask值为0x00000000,CollisionBitmask值为0xFFFFFFFF,这意味着所有实体将相互冲突,但默认情况下不会发送联系事件。

观察上面的 SECOND 和第三点。在游戏中相应地设置位数。

制作静态物体

pinkBall-> setDynamic(假); //这里不需要设置重力假。现在粉红色的球变得静止,没有重力效应

答案 1 :(得分:0)

bool IngameScene::onContactBallsBegin(PhysicsContact& contact)

此方法应返回bool。你没有回报任何东西。很确定编译器会抱怨这一点。不确定C ++默认是什么,它甚至可能返回垃圾。

如果你想要身体碰撞,则返回true,如果它们应该相互穿过则返回false。