2014-03-30 155 views
0

我正在試圖用Box2d做一個簡單的射擊遊戲。動態對象之間的Box2d碰撞

敵人和子彈都是動態的身體。我在屏幕左側創建敵人,然後對它們施加線性力量,使它們向右移動。玩家需要三次擊中敵人才能殺死它。

我的問題是,如果前兩次被子彈擊中,我怎麼能讓敵人繼續移動?現在,當敵人第一次被擊中時,它會被擊倒甚至被擊倒。我希望敵人只有在被殺的時候纔會這樣(第三次被擊中)。我應該怎麼做?

感謝您的任何建議!

一些代碼在這裏:

// Apply force 
    rock.isFlying = 1; 
    b2Vec2 force = b2Vec2(-2.0f*distance*cos,-2.0f*distance*sin); 
    rockBody->ApplyForce(force,rockBody->GetWorldCenter()); 
    rockBody->SetLinearDamping(0.2f); 

- (void)birdFly:(ccTime)dt{ 
    for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) 
    { 
     ZLBird *myBird = (__bridge ZLBird*)b->GetUserData(); 
     if (b->GetUserData() != NULL && myBird.tag == TAG_BIRD) 
     { 
      // Apply force 
      b2Vec2 gravityOffset; 
      gravityOffset.x = 0; 
      gravityOffset.y = myBird.multiplier*(myBird.startY - myBird.position.y); 
      if (!myBird.isDead) 
       b->ApplyForce(gravityOffset , b->GetWorldCenter()); 
     } 
    } 
} 

void ContactListener::BeginContact(b2Contact* contact) 
{ 
    b2Body* bodyA = contact->GetFixtureA()->GetBody(); 
    b2Body* bodyB = contact->GetFixtureB()->GetBody(); 
    CCSprite* spriteA = (__bridge CCSprite*)bodyA->GetUserData(); 
    CCSprite* spriteB = (__bridge CCSprite*)bodyB->GetUserData(); 

    if (spriteA != NULL && spriteB != NULL) 
    { 
     // if hit by rock 
     if (spriteA.tag == -1 && spriteB.tag == TAG_BIRD){ 
      ZLBird *myBird = (__bridge ZLBird*)bodyB->GetUserData(); 
      ZLRock *myRock = (__bridge ZLRock*)bodyA->GetUserData(); 
      [myBird getHurt]; 
     } 
     else if(spriteB.tag == -1 && spriteA.tag == TAG_BIRD) { 
      ZLBird *myBird = (__bridge ZLBird*)bodyA->GetUserData(); 
      ZLRock *myRock = (__bridge ZLRock*)bodyB->GetUserData(); 
      [myBird getHurt]; 
     } 
} 
} 
+0

我們可以看到一些代碼嗎? – Roecrew

+0

當然!我剛剛編輯了這個問題。 – alanlzl

+0

我可以看到getHurt方法嗎? – Roecrew

回答

1

preSolve和postSolve接觸聽衆回調方法將有助於在這裏。您可以在preSolve()方法中設置SetEnabled(false),以便box2d不會計算要應用於主體的所需力。即box2d將跳過碰撞。但請注意,這僅適用於特定的時間步長。在下一個box2d時間步驟中,計算碰撞。爲了在前兩次跳過岩石和鳥類之間的完整碰撞,您需要在每一幀中調用SetEnabled(false),但需要檢查。因此對於例如

在巖體的用戶數據中取一個整數。並且在每個時間步驟中,您只需調用SetEnabled(false)並遞增整數直到整數變爲2.一旦這是2,則下一次不會調用SetEnabled(false)。默認情況下,它將設置爲SetEnabled(true)。在第三次擊中時,box2d將對巖體施加力量。

您必須閱讀http://www.iforce2d.net/b2dtut/collision-anatomy

具體閱讀preSolve和postSolve回調。