我有 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/