检测到联系后如何移动身体

时间:2015-11-13 16:31:59

标签: 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.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

1 个答案:

答案 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

的内容