2013-03-15 30 views
0

我的测试环境:如何检测由PhyicsEditor在Cocos2d-x中创建的box2d灯具内的触摸?

的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);

因此,精灵不会移动。

  • 替换源代码内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);

    为(b2Body * B =世界 - > 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()); 
        } 
    } 
    

    }

  • 的问题是,测试点只在非常小的区域(不是整个形状区域)返回true。

    下面是截图:

    enter image description here

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

    更新:显示来自PhysicsEditor

    enter image description here

    回答

    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();    
    } 
    
    +0

    感谢您的回复。我认为在我的情况下,一个身体只有一个固定装置,所以我只拿到第一个固定装置。 (我实际上做了一些测试,比如你的建议,我会再试一次。) “Box2d每个灯具只允许8个顶点”,这是否意味着我最多可以在PhysicsEditor中为我的精灵添加8个顶点? 谢谢 – 2013-03-15 09:50:59

    +0

    顺便说一下,我添加了PhysicsEditor生成的数据截图。它显示一个精灵只有一个固定装置(例如,热狗)。但是有多个多边形数组。夹具肯定有8个以上的顶点。 – 2013-03-15 09:56:35

    +0

    我发现PhysicsEditor自动创建多个灯具。但是一个灯具内有多个多边形。这些多边形的顶点总数将超过8个。但它仍然适用于您的方法。 (我需要在CCLog后添加一个中断。)无论如何,我会在我的真实应用程序cocos2d-x 2.0中测试这个。我会让你知道结果。谢谢 – 2013-03-15 10:15:54