{"id":297,"date":"2015-02-23T08:19:41","date_gmt":"2015-02-23T08:19:41","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=297"},"modified":"2018-12-02T07:18:33","modified_gmt":"2018-12-02T07:18:33","slug":"classe-boundingvolumetrigger","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=297","title":{"rendered":"Classe BoundingVolumeTrigger pour vos triggers"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/1.gif\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-4351\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/1.gif\" alt=\"1\" width=\"262\" height=\"287\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Dans un jeu vid\u00e9o on doit utiliser beaucoup de bounding boxes pour d\u00e9clencher certains \u00e9v\u00e9nements.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>Si vous ne savez pas ce qu&rsquo;est une <em>Bounding Box<\/em> : se r\u00e9f\u00e9rer \u00e0 l&rsquo;article traitant les Bounding Boxes.<br \/>\nSi vous ne savez pas ce qu&rsquo;est un <em>Event<\/em> : se r\u00e9f\u00e9rer \u00e0 l&rsquo;article traitant les Events.<\/p>\n<p><strong>Utilisation :<\/strong><\/p>\n<p>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\u00e9clencheur), pour ensuite faire appel \u00e0 l\u2019\u00e9v\u00e9nement (Event) associ\u00e9.<\/p>\n<p>Voici une classe \u00e0 copier pour impl\u00e9menter le m\u00e9canisme de triggers dans vos jeux.<\/p>\n<p>Dans le fichier .h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#ifndef BOUNDING_BOX_TRIGGER_H\r\n#define BOUNDING_BOX_TRIGGER_H\r\n\r\nclass BoundingVolumeTrigger\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0BoundingVolumeTrigger(const Ogre::AxisAlignedBox&amp; BV);\r\n\u00a0\u00a0 \u00a0virtual ~BoundingVolumeTrigger();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ AABB \/ Sphere principale \u00e0 tester\r\n\u00a0\u00a0 \u00a0void registerMainCheckedBV(const Ogre::AxisAlignedBox&amp; BV);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Les AABB \/ Sphere sur lequels sont test\u00e9es les intersections de AABB \/ Sphere\r\n\u00a0\u00a0 \u00a0void registerBoundingBox(const Ogre::AxisAlignedBox&amp; BV);\u00a0\u00a0 \u00a0\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Les events \u00e0 invoquer lors d'une collision\r\n\u00a0\u00a0 \u00a0void registerEvent(Event* pEvent);\r\n\r\n\u00a0\u00a0 \u00a0bool checkCollision();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Met \u00e0 jour les v\u00e9rification de d\u00e9clenchement (triggering)\r\n\u00a0\u00a0 \u00a0void update();\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0Ogre::AxisAlignedBox m_testedAABB;\r\n\r\n\u00a0\u00a0 \u00a0std::vector&lt;const Ogre::AxisAlignedBox&gt; m_boundingBoxesToTest;\r\n\r\n\u00a0\u00a0 \u00a0std::vector&lt;Event*&gt; m_pCollisionEvents;\r\n\r\n    bool m_bTriggerDone;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>Dans le fichier .cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nBoundingVolumeTrigger::BoundingVolumeTrigger(const Ogre::AxisAlignedBox&amp; BV)\r\n{\r\n    m_bTriggerDone = false;\r\n\u00a0\u00a0 \u00a0m_testedAABB = BV;\r\n}\r\n\r\nBoundingVolumeTrigger::~BoundingVolumeTrigger()\r\n{\r\n}\r\n\r\nvoid BoundingVolumeTrigger::registerMainCheckedBV(const Ogre::AxisAlignedBox&amp; BV)\r\n{\r\n\u00a0\u00a0 \u00a0m_testedAABB = BV;\r\n}\r\n\r\nvoid BoundingVolumeTrigger::registerBoundingBox(const Ogre::AxisAlignedBox&amp; BV)\r\n{\r\n\u00a0\u00a0 \u00a0m_boundingBoxesToTest.push_back(BV);\r\n}\r\n\r\nvoid BoundingVolumeTrigger::registerBoundingSphere(const Ogre::Sphere&amp; BV)\r\n{\r\n\u00a0\u00a0 \u00a0m_boundingSpheresToTest.push_back(BV);\r\n}\r\n\r\nvoid BoundingVolumeTrigger::registerEvent(Event* pEvent)\r\n{\r\n\u00a0\u00a0 \u00a0m_pCollisionEvents.push_back(pEvent);\r\n}\r\n\r\nvoid BoundingVolumeTrigger::update()\r\n{\r\n\u00a0\u00a0 \u00a0bool bColision = checkCollision();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Invoque tous les events associ\u00e9s \u00e0 la collision\r\n\u00a0\u00a0 \u00a0if (bColision &amp;&amp; !m_bTriggerDone)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (unsigned int i = 0; i &lt; m_pCollisionEvents.size(); i++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Event* pEvent = m_pCollisionEvents[i];\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pEvent-&gt;trigger();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n        m_bTriggerDone = true;\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nbool BoundingVolumeTrigger::checkCollision()\r\n{\r\n\u00a0\u00a0 \u00a0bool collided = false;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ AABB \u00e0 tester\r\n\u00a0\u00a0 \u00a0for (unsigned int i = 0; i &lt; m_boundingBoxesToTest.size(); i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (m_testedAABB.contains(m_boundingBoxesToTest[i]))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0collided = true;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return collided;\r\n}\r\n\r\n<\/pre>\n<p>La variable m_bTriggerDone restreint l&rsquo;invocation du d\u00e9clencheur \u00e0 un seul appel par rencontre<br \/>\nde collision.<\/p>\n<p><strong>R\u00e9sum\u00e9 :\u00a0<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Dans un jeu vid\u00e9o on doit utiliser beaucoup de bounding boxes pour d\u00e9clencher certains \u00e9v\u00e9nements. Pr\u00e9requis : Si vous ne savez pas ce qu&rsquo;est une Bounding Box : se r\u00e9f\u00e9rer \u00e0 l&rsquo;article traitant les Bounding Boxes. Si vous ne savez pas ce qu&rsquo;est un Event : se r\u00e9f\u00e9rer \u00e0 l&rsquo;article traitant les Events. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[16],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/297"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=297"}],"version-history":[{"count":45,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/297\/revisions"}],"predecessor-version":[{"id":5791,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/297\/revisions\/5791"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=297"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=297"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=297"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}