0

私は、Box2d 2.2.1 で cocos2d-x 2.0.3 を使用しており、フレームにダイナミック ボディ (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 で動的ボディをカテゴリに (フラグを使用して) 設定していないことでした。私のコードではまだそれらを使用していませんが、衝突を発生させるには、おそらく 1 つのカテゴリに設定する必要があります (私は本体を bit_0 に設定しました)。

ジャン

于 2013-01-05T14:33:35.560 に答える