Intro :
Dans un jeu vidéo on doit utiliser beaucoup de bounding boxes pour déclencher certains événements.
Prérequis :
Si vous ne savez pas ce qu’est une Bounding Box : se référer à l’article traitant les Bounding Boxes.
Si vous ne savez pas ce qu’est un Event : se référer à l’article traitant les Events.
Utilisation :
Par exemple lorsque que le joueur entre dans une nouvelle zone, on a besoin de tester deux bounding boxes : celle du joueur et celle du trigger (déclencheur), pour ensuite faire appel à l’événement (Event) associé.
Voici une classe à copier pour implémenter le mécanisme de triggers dans vos jeux.
Dans le fichier .h :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#ifndef BOUNDING_BOX_TRIGGER_H #define BOUNDING_BOX_TRIGGER_H class BoundingVolumeTrigger { public: BoundingVolumeTrigger(const Ogre::AxisAlignedBox& BV); virtual ~BoundingVolumeTrigger(); // AABB / Sphere principale à tester void registerMainCheckedBV(const Ogre::AxisAlignedBox& BV); // Les AABB / Sphere sur lequels sont testées les intersections de AABB / Sphere void registerBoundingBox(const Ogre::AxisAlignedBox& BV); // Les events à invoquer lors d'une collision void registerEvent(Event* pEvent); bool checkCollision(); // Met à jour les vérification de déclenchement (triggering) void update(); private: Ogre::AxisAlignedBox m_testedAABB; std::vector<const Ogre::AxisAlignedBox> m_boundingBoxesToTest; std::vector<Event*> m_pCollisionEvents; bool m_bTriggerDone; }; #endif |
Dans le fichier .cpp :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
BoundingVolumeTrigger::BoundingVolumeTrigger(const Ogre::AxisAlignedBox& BV) { m_bTriggerDone = false; m_testedAABB = BV; } BoundingVolumeTrigger::~BoundingVolumeTrigger() { } void BoundingVolumeTrigger::registerMainCheckedBV(const Ogre::AxisAlignedBox& BV) { m_testedAABB = BV; } void BoundingVolumeTrigger::registerBoundingBox(const Ogre::AxisAlignedBox& BV) { m_boundingBoxesToTest.push_back(BV); } void BoundingVolumeTrigger::registerBoundingSphere(const Ogre::Sphere& BV) { m_boundingSpheresToTest.push_back(BV); } void BoundingVolumeTrigger::registerEvent(Event* pEvent) { m_pCollisionEvents.push_back(pEvent); } void BoundingVolumeTrigger::update() { bool bColision = checkCollision(); // Invoque tous les events associés à la collision if (bColision && !m_bTriggerDone) { for (unsigned int i = 0; i < m_pCollisionEvents.size(); i++) { Event* pEvent = m_pCollisionEvents[i]; pEvent->trigger(); } m_bTriggerDone = true; } } bool BoundingVolumeTrigger::checkCollision() { bool collided = false; // AABB à tester for (unsigned int i = 0; i < m_boundingBoxesToTest.size(); i++) { if (m_testedAABB.contains(m_boundingBoxesToTest[i])) { collided = true; } } return collided; } |
La variable m_bTriggerDone restreint l’invocation du déclencheur à un seul appel par rencontre
de collision.
Résumé :


