2010-11-24 80 views
1

我想做一個排球比賽,並根據box2d模擬每個動作。我想要做的是當球員擊球時有不同的球恢復原狀,球擊中牆壁。所以在第一種情況下,球會飛得更快,而第二種情況會更慢。box2D閃光燈:選擇性的結婚

但是,如果我試圖以不同的方式爲玩家和牆體物品設置賠償,我還會注意到玩家本身正在從牆上彈起......有沒有辦法以選擇性的方式做到這一點?例如。擊球場地不應該導致球員反彈......但是如果球員擊中球,它應該反彈很多。

回答

2

不幸的是,你是對的,Box2D還沒有這個設置。

你可以做的是傾聽與球員和球都相匹配的聯繫偵聽器事件。當發生這種情況時,你會對球施加非常大的力量。

編輯

我打這關我的頭頂,我不知道這是完全正確的。

public class MyContactListener extends b2ContactListener { 
    override public function Add(point:b2ContactPoint):void { 
     var ball:b2Body = ... 
     var player:b2Body = ... // fill these 
     var force:b2Vec2; 

     if(point.shape1.GetBody() == ball && point.shape2.GetBody() == player) { 
      force = point.normal.Copy(); 
      force.Multiply(SOMETHING); 
      ball.ApplyForce(force); 
     } else if(point.shape1.GetBody() == player && point.shape2.GetBody() == ball) { 
      force = point.normal.Copy(); 
      force.Multiply(-SOMETHING); 
      ball.ApplyForce(force); 
     } 
    } 
} 

這是怎麼回事。

你需要創建這個類的一個實例,並將其註冊到可能類似world.SetContactListener(new MyContactListener)之類的世界。

兩個物體接觸時會觸發Add()方法。施加的力是在接觸法線的方向上(這會使您從一個身體到另一個身體)。

由於聯繫人偵聽器系統的設置方式,球或玩家可能是b2ContactPoint結構中的主體#1,因此您需要爲這種可能性編碼。法線的方向取決於哪一個是身體#1(因此是負號)。我實際上不記得它走哪條路,所以你可能需要扭轉力量(把減號放在另一個分支)。

除此之外,它應該是合理清楚的。 Box2D在這裏似乎並不出名,所以你可能在Box2D論壇上有更多的運氣(http://www.box2d.org/forum/

+0

一行代碼作爲例子將會非常有幫助:) – 2010-11-24 14:50:31