我不想在检测到来自另一个身体的接触后移动我的静态身体,我所做的是创建一个实现ContactLisner
的类。我能够检测到两个物体碰撞的时间,但是当我试图移动尸体时我有错误。
//this is my first try, the idea was to call this method when contact is detected.
public static void movePlatform(){
platform.setTransform(position.x += 21f, position.y, 0f);
}
//on my contact listener class
public void beginContact(Contact contact) {
Fixture fa = contact.getFixtureA();
Fixture fb = contact.getFixtureB();
Platform.movePlatform();
}
我也试过了,但我不知道是否可以这样做:
public void beginContact(Contact contact) {
Fixture fa = contact.getFixtureA();
Fixture fb = contact.getFixtureB();
fb.getBody().setTransform(10f, 0f, 0f);
}
当正文碰撞到另一个正文时,桌面应用程序停止响应并收到此消息:
此应用程序已请求运行时将其终止 不寻常的方式请联系应用程序的支持团队获取更多信息 信息。 AL lib:(EE)alc_cleanup:1设备未关闭断言 失败!
程序:C:\ Program Files \ Java \ jdk1.8.0_51 \ bin \ java.exe文件: /var/lib/jenkins/workspace/libgdx/extensions/gdx-box2d/gdx-box2d/jni/Box2D/Dynamics/b2Body.cpp, 第419行
表达式:m_world-> IsLocked()== false
答案 0 :(得分:2)
我认为你的问题是在模拟步骤中调用了联系人监听器中的代码,因此你无法在那里修改世界。换句话说,世界被锁定了。解决问题的一种方法是Gdx.app.postRunnable
。所以在你的例子中尝试:
public void beginContact(Contact contact) {
Fixture fa = contact.getFixtureA();
Fixture fb = contact.getFixtureB();
Gdx.app.postRunnable(new Runnable() {
@Override
public void run () {
fb.getBody().setTransform(10f, 0f, 0f);
}
});
}
这将在下一帧的渲染线程中运行Runnable中的代码。
修改强>
在beginContact
中,渲染线程被锁定,这意味着您无法移动或操纵任何与box2d相关的主体。这是box2d正常工作所必需的。 Runnable是Java中的一个特殊接口,由Thread类实现。这将打开一个新线程,并将数据传递到下一帧中的呈现线程。我建议你阅读更多有关libgdx threading