【问题标题】:How does the LibGDX Bullet extension's ContactListener work?LibGDX Bullet 扩展的 ContactListener 是如何工作的?
【发布时间】:2014-08-23 14:25:58
【问题描述】:

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

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

没有其他事情需要做。该代码可以完美运行,而无需再次引用该实例。这怎么可能?

【问题讨论】:

    标签: java libgdx bulletphysics


    【解决方案1】:

    这是因为幕后发生的一些事情。子弹包装器通过 JNI 调用子弹。这主要通过类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() 将其关闭。

    【讨论】:

    • 所以如果我理解正确的话,CollisionJNI 在实例化时保留对ContactListener 的引用,然后btCollisionWorld.performDiscreteCollisionDetectionCollisionObjects 传递给CollisionJNI,它执行碰撞检测计算,并在必要时触发ContactListener 回调。对吗?
    • 不,CollisionJNI 不保留任何引用。它的唯一目的是通过 JNI 连接 libgdx 和 bullet。 ContactListener 本身存储指向本机 C++ 对象的指针(只是一个 long 值)。但是,我不确定来自 bullet -> libgdx 的通信实际上是如何工作的。
    • 好的,有道理。然后我假设在 C++ 端也必须有一个指向 Java ContactListener? 的指针
    • 是的,类似的。你应该检查这个:en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_works
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多