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

Bag*_*yer 0 physics touch box2d cocos2d-x

我的测试环境:

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

我在PhysicsEditor cocos2dx演示的HelloWorldScene中修改了一下以使其更简单,以下是我的一些代码:

  1. initPhysics

    gravity.Set(0.0f,0.0f);

这样精灵就不会动了.

  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());
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    }

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

这是截图:

在此输入图像描述

任何人都可以建议我如何调试这个问题?谢谢

更新:显示PhysicsEditor生成的数据

在此输入图像描述

小智 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();            
}  
Run Code Online (Sandbox Code Playgroud)