【问题标题】:How to move body after Contact is detected检测到接触后如何移动身体
【发布时间】:2015-11-13 16:31:58
【问题描述】:

在检测到来自另一个身体的接触后,我不想移动我的静态身体,我所做的是创建一个实现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

【问题讨论】:

标签: java android libgdx box2d


【解决方案1】:

我认为您的问题是在模拟步骤期间调用了联系人侦听器中的代码,因此您无法修改那里的世界。换句话说,世界被锁定了。解决问题的一种方法是拥有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

【讨论】:

  • 谢谢它的工作,但你能解释一下 beginContact() 方法的作用吗?
  • 我是一般的编程新手,这是我第一次遇到这种代码。一个内部有方法的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多