如何检测由Cocos2d-x中的PhyicsEditor创建的box2d夹具内的触摸?

时间:2013-03-15 05:33:03

标签: touch box2d physics cocos2d-x

我的测试环境:

Xcode 4.6,新的cocos2d-x + box2d项目 的cocos2d-2.1beta3-X-2.1.1 PhysicsEditor 1.0.10

我修改了HelloWorldScene of PhysicsEditor cocos2dx demo中的一点以使其更简单,以下是我的一些代码:

  1. initPhysics

    gravity.Set(0.0f,0.0f);

  2. 这样精灵就不会移动了。

    1. 将ccTouchesEnded中的源代码替换为:

      CCTouch * pTouch =(CCTouch *)touches-> anyObject();

      CCPoint location = pTouch-> locationInView(pTouch-> view());

      CCPoint convLoc = CCDirector :: sharedDirector() - > convertToGL(location);

      b2Vec2 v = b2Vec2(convLoc.x / PTM_RATIO,convLoc.y / PTM_RATIO);

      for(b2Body * b = world-> GetBodyList(); b; b = b-> GetNext()) {

      b2Fixture *f = b->GetFixtureList(); // get the first fixture
      CCSprite *sprite =(CCSprite *) b->GetUserData();
      
      if(sprite != NULL)
      {
          if(f -> TestPoint(v))
          {
              CCLog("You touched a body %d",sprite->getTag());
          }
      }
      

      }

    2. 问题是TestPoint只在非常小的区域内返回true(而不是整个形状区域)。

      以下是截图:

      enter image description here

      有人可以建议我如何调试这个问题吗?感谢

      更新:显示来自PhysicsEditor的生成数据

      enter image description here

1 个答案:

答案 0 :(得分:5)

问题是你只能探测第一个夹具。但复杂的身体是由几个人组成的。原因是

  • Box2d每个灯具仅允许8个顶点
  • Box2d只能使用凸形

这就是复杂形状被分解为多边形列表的原因。

改为对夹具列表进行迭代。

b2Fixture *f = body->GetFixtureList();
while(f)
{
    if(f -> TestPoint(v))
    {
        CCLog("You touched a body %d",sprite->getTag());
    }
    f = f->GetNext();            
}