0

我的测试环境:

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

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

  1. 初始化物理

    重力.Set(0.0f, 0.0f);

这样精灵就不会动了。

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

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

    CCPoint 位置 = 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());
        }
    }
    

    }

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

这是屏幕截图:

在此处输入图像描述

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

更新:显示从 PhysicsEditor 生成的数据

在此处输入图像描述

4

1 回答 1

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();            
}  
于 2013-03-15T07:13:08.623 回答