2013-11-30 2 views
2

У меня есть 2 объекта, сфера и коробка, которые, когда один сталкивается с другим, совершают какое-либо действие (т. Е. Уничтожают окно).ответный звонок столкновения между двумя телами

я попытался несколько способов:

  • checkCollideWith всегда возвращает значение ИСТИНА;
  • контактPairTest - это не понимаю, как использовать. Требуется 3 аргумента, 2 объекта и обратный вызов. Я думал, что обратный вызов может быть любой функцией в моем коде, но это не работает.

Может кто-нибудь, пожалуйста, привести пример того, как вызвать метод, например CollissionResult(), когда сталкиваются 2 btRigidBodies (т. Е. BodyA и bodyB)?

+0

Быстрая проверка дюрации показывает, что contactPairTest ожидает объект, тип которого получен из абстрактного класса ContactResultCallback. Итак, ваш вопрос: как это сделать? – john

ответ

5

Возможно, этот пример поможет объяснить концепцию. Вы должны определить новый класс, полученный из существующего абстрактного класса. Вы переопределяете один из методов абстрактных классов с кодом обратного вызова. Затем вы создаете объект производного класса и передаете его функции, которую вы хотите вызвать обратный вызов. Это довольно распространенная методика 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, вы можете заменить его каким бы то ни было реальным типом.

Это точка использования объекта в качестве обратного вызова вместо функции. Если обратный вызов является объектом, вы можете добавлять к нему данные, для чего вы хотите, вы не можете сделать это с помощью функции.

+0

эй там. Спасибо за ответ. Я пробовал ваш пример, а затем создал объект myContactResultCallback «Обратный вызов MyContactResultCallback;», а затем вызвал метод contactPairTest 'bt_dynamicsWorld-> contactPairTest (bodyA, bodyB, callback);'. Запуск привел к ошибке, говорящей, что addSingleResult необходимо вернуть значение, поэтому я добавил 'return 0;'. Это позволило запустить программу, но когда я столкнулся с двумя объектами, обратный вызов не был вызван (2 объекта явно столкнулись с возвратом) – b0Gd4N

+1

@ b0Gd4N Ну, боюсь, я помог вам столько, сколько смогу (т. е. с синтаксисом C++). Как я уже сказал, я вообще не знаю эту библиотеку. – john

+0

не беспокоится, спасибо в любом случае! – b0Gd4N