2013-01-05 129 views
0

我在Box2d 2.2.1中使用cocos2d-x 2.0.3,並且第一個示例我已經在框架中引入了動態主體(用PhysicsEditor定義的船)。應用重力時,預期的行爲是船與框架碰撞,但它會通過。box2d主體和框架之間缺少碰撞

這裏是世界和機構的定義:

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

正如你可以在下面的截圖船是在框架中看到那麼就應該有是碰撞: screenshot

任何幫助嗎?

在此先感謝。

回答

0

問題解決了,問題是,在PhysicsEditor我沒有設置動態物體的類別(旗)。在我的代碼中,我還沒有使用它們,但是可能你必須將它設置在一個類別中以產生衝突(我已將自己的身體設置爲bit_0)。

Jean