2012-04-11 54 views
1

我正在用box2d在cocos2d上製作遊戲,並且遇到了一些問題。Box2d動態子彈身體沉入靜態物體

我有程序遍歷tilemap的(.tmx)行和列,搜索「collidable」屬性設置爲「true」的tile。如果找到一個,則在該瓷磚的位置上設置一個方形靜態box2d主體(帶有固定裝置和全部)。所以基本上,我應該在迭代完成後,根據需要設置一堆正方體(取決於tilemap)。我也有一個方形的動態身體,通過手勢控制(向上的手勢向上滑動,向下的手勢向下等等),它應該只在四個方向中的一個方向上移動:上,下,左,右。人體的恢復是0.0f,因此它在沒有反彈的情況下停止衝擊,並且摩擦也是0.0f,因爲它不是必需的(世界的重力是0.0f,0.0f)。由於通過tilemap的迭代只能放置正方形的物體,因此遊戲中的「牆」由幾個這樣的方塊組成,這些方塊彼此相鄰排列,首尾相連,這爲動態物體碰撞創建了齊平邊緣用。

當動態物體碰撞到正方形牆時,會出現問題。我通過根據手勢設置身體的速度來控制身體的運動。移動到右側的一個例子是:

#define bodyVel 100 
... 
if (gestureRight) 
{ 
body->SetLinearVelocity(b2Vec2(bodyVel/PTM_RATIO, 0)); 
} 

我身上設置爲子彈,這樣當它與牆壁碰撞也不會成爲鑲嵌,但我已經遇到了一些奇怪的結果。一個例子是這樣的:

我把身體向右移動到牆上,它停下來。好。接下來,我想把它往上移,所以我向上。好。但是,有時候,當它在牆上滑動時,身體似乎「抓住」了某些東西,並且它在多個方向上失去控制。壞。

我能想出的唯一解釋是動態物體事實上是在第一個接觸頭上嵌入牆內的,當它在下一個給定的運動姿勢時滑動到牆上時,它會被捕獲在構成牆壁的正方形的邊緣之一上,並且從直線路徑震動。我通過設定身體有一個固定的旋轉(根本不旋轉),證實了這種奇怪的活動,因此,而不是身體無法控制,它會停止。根據我的假設,這是預期的。所以動態的身體正在變得嵌入是我想說的。

我不明白爲什麼會發生這種情況,因爲我的身體被設置爲像子彈一樣行爲,以避免像這樣的問題。我希望物體做的事情是能夠沿着直線路徑 - 無論是向上,向下,向左還是向右 - 移動,在與牆壁接觸時停止,沿着牆壁移動,而不受構成牆體的物體的干擾。

我覺得,除非我對子彈體如何工作有誤解,否則發生的嵌入不應該成爲問題。

我也習慣DebugDraw來查看方形靜態物體是否創建了一個平面牆並且他們做了。

回答

1

不幸的是,這是Box2D的一個已知的問題... from the FAQ

瓷磚基礎的環境

使用多盒爲您的地形可能無法正常工作,因爲盒狀 字符可以在內部角落掛鉤。未來更新至 Box2D應允許在邊緣鏈上平滑移動。一般來說,您應避免使用矩形字符,因爲容差仍然會導致不合需要的掛鉤。

欲瞭解更多信息,請參閱這篇文章: http://box2d.org/forum/viewtopic.php?f=3&t=3048