java - LibGDX Bullet 扩展的 ContactListener 如何工作?

标签 java libgdx bulletphysics

我一直在阅读这篇关于使用 LibGDX Bullet 包装器的博客文章: http://blog.xoppa.com/using-the-libgdx-3d-physics-bullet-wrapper-part1/

我无法理解有关使用 ContactListener 回调的部分。要创建碰撞回调,您要做的就是使用重写的方法扩展 ContactListener 类,然后实例化它。

无需执行任何其他操作。该代码可以完美运行,无需再次引用该实例。这怎么可能?

最佳答案

这是因为幕后发生的一些事情。子弹包装器通过 JNI 调用子弹。这主要是通过 CollisionJNI 类发生的,该类具有许多静态方法。

当查看source时在 ContactListener 类中,您将看到以下构造函数:

public ContactListener() {
    this(false);
    if (!setEvents())
        throw new com.badlogic.gdx.utils.GdxRuntimeException("Only one method per callback event can be overridden.");
    enable();
}

...

public void enable() {
    CollisionJNI.ContactListener_enable(swigCPtr, this);
}

如您所见,ContactListener 的构造函数(当您实例化任何扩展它的子类时调用)将自动调用 enable(),它通过 JNI 注册此实例作为回调监听器。

这里没有黑魔法:=)

如果这会让您感觉更舒服,您可以自己添加对 myContactListener.enable() 的调用。同样,可以调用 myContactListener.disable() 将其关闭。

关于java - LibGDX Bullet 扩展的 ContactListener 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25462954/

相关文章:

java - 使用 Maven 创建 Web 应用程序框架

java - Libgdx 加速度计不工作?

android - libgdx 中使用单独纹理的动画

c++ - 如何在 GPU 上运行子弹物理解决方案

java - Black Berry - 如何避免此 FieldChangeListener.fieldChanged 中的无限循环

java - 捕获编号格式异常

Java LibGDX BitmapFont setScale 方法不起作用

c++ - 我将如何使用 Bullet Physics Library 设置碰撞?

c++ - 子弹物理学 : Body moves after fall (shakes and moves to the side)

java - 如何从另一个java类中查找TestNG类中有多少个测试用例