0

我将 cocos2d-x 2.0.3 与 Box2d 2.2.1 一起使用,并且有第一个示例,我在框架中引入了动态主体(用 PhysicsEditor 定义的船)。应用重力,预期的行为是船与框架发生碰撞,但它却通过了。

这是世界和物体的定义:

      // create world
  b2Vec2 gravity;
  gravity.Set(0.1f, -0.0f);
  bool doSleep = true;
  world = new b2World(gravity);
  world->SetAllowSleeping(doSleep);
  world->SetContinuousPhysics(true);
  // Debug Draw functions
  m_debugDraw = new GLESDebugDraw( PTM_RATIO * CCDirector::sharedDirector()->getContentScaleFactor());
  world->SetDebugDraw(m_debugDraw);
  uint32 flags = 0;
  flags += b2Draw::e_shapeBit;
  flags += b2Draw::e_jointBit;
  flags += b2Draw::e_aabbBit;
  flags += b2Draw::e_pairBit;
  flags += b2Draw::e_centerOfMassBit;
  m_debugDraw->SetFlags(flags);

  // for the screenBorder body we'll need these values
  CCSize screenSize = size;
  float widthInMeters = screenSize.width / PTM_RATIO;
  float heightInMeters = screenSize.height / PTM_RATIO;
  b2Vec2 lowerLeftCorner = b2Vec2(- widthInMeters / 2, 0.0);
  b2Vec2 lowerRightCorner = b2Vec2(widthInMeters / 2, 0.0);
  b2Vec2 upperLeftCorner = b2Vec2(- widthInMeters / 2, heightInMeters);
  b2Vec2 upperRightCorner = b2Vec2(widthInMeters/2, heightInMeters);

  // Define the static container body, which will provide the collisions at screen borders.
  b2BodyDef screenBorderDef;
  screenBorderDef.position.Set(0, 0);
  screenBorderDef.type = b2_staticBody;
  b2Body* screenBorderBody = world->CreateBody(&screenBorderDef);
  b2EdgeShape screenBorderShape;

  // Create fixtures for the four borders (the border shape is re-used)
  screenBorderShape.Set(lowerLeftCorner, lowerRightCorner);
  screenBorderBody->CreateFixture(&screenBorderShape, 0);
  screenBorderShape.Set(lowerRightCorner, upperRightCorner);
  screenBorderBody->CreateFixture(&screenBorderShape, 0);
  screenBorderShape.Set(upperRightCorner, upperLeftCorner);
  screenBorderBody->CreateFixture(&screenBorderShape, 0);
  screenBorderShape.Set(upperLeftCorner, lowerLeftCorner);
  screenBorderBody->CreateFixture(&screenBorderShape, 0);

  // add sail boat sprite
  CCSprite *sailBoatSprite = CCSprite::create("SailBoat.png");
  addChild(sailBoatSprite, -1, kSailingBoat);
  sailBoatSprite->setAnchorPoint(ccp(0.5, 0.5));
  sailBoatSprite->setPosition(ccp(0.0, 128.0));

  // add sail boat body
  GB2ShapeCache *shapeCache = GB2ShapeCache::sharedGB2ShapeCache();
  shapeCache->addShapesWithFile("SailBoat.plist");
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(0.0/PTM_RATIO, 128.0/PTM_RATIO);
    bodyDef.userData = sailBoatSprite;
    b2Body *body = world->CreateBody(&bodyDef);
  shapeCache->addFixturesToBody(body, "SailBoat");
  sailBoatSprite->setAnchorPoint(GB2ShapeCache::sharedGB2ShapeCache()->anchorPointForShape("SailBoat"));
  this->schedule(schedule_selector(SailingFieldNode::tick));

这是更新方法:

void SailingFieldNode::tick(float dt)
{
    int32 velocityIterations = 8;
    int32 positionIterations = 1;
    world->Step(0.01, velocityIterations, positionIterations);
    for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
    {
        if (b->GetUserData() != NULL) {
            CCSprite *myActor = (CCSprite*)b->GetUserData();
            myActor->setPosition(ccp( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO));
            myActor->setRotation(-1 * CC_RADIANS_TO_DEGREES(b->GetAngle()));
        }
    }
}

void SailingFieldNode::draw()
{
  CCLayer::draw();
  ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position);
  kmGLPushMatrix();
  world->DrawDebugData();
  kmGLPopMatrix();
  CHECK_GL_ERROR_DEBUG();
}

正如您在以下屏幕截图中看到的那样,船在框架中,那么应该会发生碰撞: 截屏

有什么帮助吗?

提前致谢。

4

1 回答 1

0

问题解决了,问题是在 PhysicsEditor 中我没有将动态主体设置在一个类别中(带有标志)。在我的代码中,我还没有使用它们,但可能您必须将其设置为一个类别才能发生碰撞(我已将我的主体设置为 bit_0)。

于 2013-01-05T14:33:35.560 回答