Java 检测到接触后如何移动身体
我不想在检测到来自另一个实体的接触后移动我的静态实体,我所做的是创建一个类来实现一个Java 检测到接触后如何移动身体,java,android,libgdx,box2d,Java,Android,Libgdx,Box2d,我不想在检测到来自另一个实体的接触后移动我的静态实体,我所做的是创建一个类来实现一个ContactLisner。当两个物体发生碰撞时,我能够检测到,但当我试图移动这些物体时,我出现了错误 //this is my first try, the idea was to call this method when contact is detected. public static void movePlatform(){ platform.setTransform(position
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_清理:1设备未关闭断言
失败了
程序:C:\Program Files\Java\jdk1.8.0\U 51\bin\Java.exe文件:
/var/lib/jenkins/workspace/libgdx/extensions/gdx-box2d/gdx-box2d/jni/box2d/Dynamics/b2Body.cpp,
第419行
表达式:m_world->IsLocked()==false
我认为您的问题在于,联系人侦听器中的代码在模拟步骤中被调用,因此您无法修改那里的世界。换句话说,世界是锁着的。解决此问题的一种方法是使用
Gdx.app.postrunable
。因此,在您的示例中,请尝试:
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中的一个特殊接口,由类线程实现。这将打开一个新线程,并在下一帧中将数据传递给渲染线程。我建议您多读一些关于的内容,谢谢它奏效了,但是您能解释一下beginContact()方法的作用吗?一般来说,我对编程是新手,这是我第一次遇到这种代码。一个内部有方法的方法。它也值得一看。