2014-06-14 61 views
1

我有兩個相互碰撞的圓。Java,libgdx,box2d,創建焊縫當兩個對象發生碰撞時

我想在碰撞時將它們焊接在一起。該代碼,beginContact函數中,是

WeldJointDef def = new WeldJointDef(); 

def.collideConnected=false; 
Vector2 worldCoordsAnchorPoint = bodyA.getWorldPoint(new Vector2(0.0f,0.0f)); 

def.bodyA = bodyA; 
def.bodyB = bodyB; 

def.localAnchorA.set(def.bodyA.getLocalPoint(worldCoordsAnchorPoint)); 
def.referenceAngle = def.bodyB.getAngle() - def.bodyA.getAngle(); 


def.initialize(def.bodyA, def.bodyB, worldCoordsAnchorPoint); 

world.createJoint(def); 

當代碼運行時,有一個C++的錯誤,但它是不是很描述:

AL lib: (EE) alc_cleanup: 1 device not closed 
Assertion failed! 

Program: C:\Program Files\Java\jre7\bin\javaw.exe 
File: /var/lib/jenkins/workspace/libgdx/extensions/gdx-box2d/gdx-box2d/jni/Box2D/Dynamics/b2World.cpp, Line 214 

Expression: IsLocked() == false 

我如何焊接工作?或者你不能以這種方式在飛行中創建焊接接頭?

+2

我不完全確定是什麼原因造成的,因此我不會提交答案,但可能是您在碰撞模擬過程中編輯了對象。 [This](http://gamedev.stackexchange.com/questions/27113/what-is-the-proper-way-to-remove-a-box2d-body-from-the-world-in-libgdx)似乎是同樣的問題,但刪除身體,而不是焊接。 – SneakyB

+2

SneakyB是正確的。您無法在世界步驟中修改模擬。在步驟完成後,您必須注意碰撞的物體並創建關節。 –

+1

這是在這裏回答。 http://stackoverflow.com/questions/21293923/how-to-make-two-bodies-stick-after-a-collision,它適用於我,我希望這可以幫助你。 – Lematva

回答

2

不要在聯繫人偵聽器中創建關節,首先將這些主體添加到某種列表中,然後在world.step()創建關節後添加它們。

你檢查一下他們是如何做到的位置:http://www.iforce2d.net/b2dtut/sticky-projectiles

所以恢復,做的方法是這樣的:

-onContactListener - >添加BodyA和BodyB參考名單。 (就像他們對「StickyInfo對象」所做的一樣)。

- 在world.step() - >使用之前的列表後,您可以爲所需的物體創建關節。