c++ - 2个物体之间的子弹碰撞回调

标签 c++ callback collision bullet

我有 2 个对象,一个球体和一个盒子,当一个与另一个碰撞时,它们会执行一些操作(即破坏盒子)。

我试过几种方法:

  • checkCollideWith 始终返回 true;
  • contactPairTest - 这个我不明白怎么用。 它需要 3 个参数,2 个对象和一个回调。我认为回调可以是我代码中的任何函数,但它不是那样工作的。

有人可以举例说明当 2 个 btRigidBodies 发生碰撞(即 bodyA 和 bodyB)时如何调用方法,例如 CollissionResult() 吗?

最佳答案

也许这个例子有助于解释这个概念。您必须定义一个从现有抽象类派生的新类。您使用回调代码覆盖其中一个抽象类方法。然后创建派生类的对象并将其传递给要调用回调的函数。这是一种足够常见的 C++ 技术。

struct MyContactResultCallback : public ContactResultCallback
{
    btScalar addSingleResult(btManifoldPoint& cp,
        const btCollisionObjectWrapper* colObj0Wrap,
        int partId0,
        int index0,
        const btCollisionObjectWrapper* colObj1Wrap,
        int partId1,
        in index1)
    {
        // your callback code here
    }
};

MyContactResultCallback callback;
world.contactPairTest(bodyA, bodyB, callback);

我应该补充一点,我对这个库一无所知。我刚刚阅读了文档。

编辑

显示如何将上下文成员添加到 MyContactResultCallback

struct MyContactResultCallback : public ContactResultCallback
{
    MyContactResultCallback(some_type* ptr) : context(ptr) {}

    btScalar addSingleResult(btManifoldPoint& cp,
        const btCollisionObjectWrapper* colObj0Wrap,
        int partId0,
        int index0,
        const btCollisionObjectWrapper* colObj1Wrap,
        int partId1,
        in index1)
    {
        context->currentPoints += 10;
    }

    some_type* context;
};

MyContactResultCallback callback(ptr_to_some_object);
world.contactPairTest(bodyA, bodyB, callback);

ptr_to_some_object 是指向具有您要递增的 currentPoints 的对象的指针。我不知道那是什么类型的对象,所以我只是说 some_type,您可以用任何实际类型替换它。

这就是使用对象而不是函数作为回调的要点。如果回调是一个对象,你可以为任何你想要的目的向它添加数据成员,你不能对函数这样做。

关于c++ - 2个物体之间的子弹碰撞回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20300615/

相关文章:

c++ - gethostbyaddr 返回 0

ruby-on-rails - 在 Rails 中创建关联模型?

javascript - Node.js 在回调中调用回调函数

java - 使用Slick在2D环境中检测碰撞

javascript - 我该如何改进这个 JavaScript 碰撞检测?

c++ - 如何让这个算法更快?

c++ - 标志如何在 C 中工作?

c++ - 如何在屏幕周围生成随机像素?

MySQL 回调 - 有这样的东西吗?

java - Java 游戏的碰撞问题