LibGDX Bullet扩展的ContactListener如何工作?

时间:2014-08-23 14:25:59

标签: java libgdx bulletphysics

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

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

不需要做任何其他事情。代码完美无需再次引用实例。这怎么可能?

1 个答案:

答案 0 :(得分:2)

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

查看ContactListener类的source时,您会看到以下构造函数:

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()来关闭它。