Возможно, этот пример поможет объяснить концепцию. Вы должны определить новый класс, полученный из существующего абстрактного класса. Вы переопределяете один из методов абстрактных классов с кодом обратного вызова. Затем вы создаете объект производного класса и передаете его функции, которую вы хотите вызвать обратный вызов. Это довольно распространенная методика 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);
Я должен добавить, что я ничего не имею об этой библиотеке. Я только что прочитал документы.
EDIT
Показывая, как добавить элемент контекста в 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
, вы можете заменить его каким бы то ни было реальным типом.
Это точка использования объекта в качестве обратного вызова вместо функции. Если обратный вызов является объектом, вы можете добавлять к нему данные, для чего вы хотите, вы не можете сделать это с помощью функции.
Быстрая проверка дюрации показывает, что contactPairTest ожидает объект, тип которого получен из абстрактного класса ContactResultCallback. Итак, ваш вопрос: как это сделать? – john