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()方法的作用吗?一般来说,我对编程是新手,这是我第一次遇到这种代码。一个内部有方法的方法。它也值得一看。