From aba30eefcdd78468c3bb4136694ea4d2de7ef452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Wed, 30 Mar 2016 23:14:31 +0200 Subject: [PATCH] =?UTF-8?q?Impl=C3=A9mentation=20plus=20propre=20des=20fon?= =?UTF-8?q?ctions=20de=20calcul=20d'info=20collision?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/collision.hpp | 21 +++++----------- src/collision.cpp | 58 +++++++++++++++++++++++++++++++------------ src/object.cpp | 6 +---- 3 files changed, 49 insertions(+), 36 deletions(-) diff --git a/include/collision.hpp b/include/collision.hpp index 9784997..8963358 100644 --- a/include/collision.hpp +++ b/include/collision.hpp @@ -1,22 +1,13 @@ #ifndef __PTF_COLLISION_HPP__ #define __PTF_COLLISION_HPP__ -#include "object.hpp" #include "collision_data.hpp" -#include -#include -#include -namespace Collision { - extern std::map< - std::pair, - std::function - > dispatch; - - bool playerToBlock(CollisionData& data); - bool blockToPlayer(CollisionData& data); - bool playerToPlayer(CollisionData& data); - bool blockToBlock(CollisionData& data); -} +/** + * Détermine les informations sur la collision + * entre les deux objets donnés dans data et + * les stocke dans data + */ +bool getCollisionData(CollisionData& data); #endif diff --git a/src/collision.cpp b/src/collision.cpp index 282539a..e86faa0 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -3,21 +3,14 @@ #include "player.hpp" #include "block.hpp" #include "object.hpp" +#include #include -// initialisation du dictionnaire associant les types -// impliqués dans une collision à leur fonction de résolution -std::map< - std::pair, - std::function -> Collision::dispatch = { - {std::make_pair(Player::TYPE_ID, Block::TYPE_ID), Collision::playerToBlock}, - {std::make_pair(Block::TYPE_ID, Player::TYPE_ID), Collision::blockToPlayer}, - {std::make_pair(Player::TYPE_ID, Player::TYPE_ID), Collision::playerToPlayer}, - {std::make_pair(Block::TYPE_ID, Block::TYPE_ID), Collision::blockToBlock} -}; - -bool Collision::playerToBlock(CollisionData& data) { +/** + * Détermination des informations sur une collision entre + * un joueur et un bloc (normale et profondeur de collision) + */ +bool playerToBlock(CollisionData& data) { Player player = dynamic_cast(data.objA); Block block = dynamic_cast(data.objB); @@ -96,7 +89,11 @@ bool Collision::playerToBlock(CollisionData& data) { return true; } -bool Collision::blockToPlayer(CollisionData& data) { +/** + * Détermination des informations sur une collision entre + * un bloc et un joueur (normale et profondeur de collision) + */ +bool blockToPlayer(CollisionData& data) { // la collision Block -> Player est la collision Player -> Block Object& objT = data.objB; data.objB = data.objA; @@ -105,7 +102,11 @@ bool Collision::blockToPlayer(CollisionData& data) { return playerToBlock(data); } -bool Collision::playerToPlayer(CollisionData& data) { +/** + * Détermination des informations sur une collision entre + * deux joueurs (normale et profondeur de collision) + */ +bool playerToPlayer(CollisionData& data) { Player playerA = dynamic_cast(data.objA); Player playerB = dynamic_cast(data.objB); @@ -136,7 +137,11 @@ bool Collision::playerToPlayer(CollisionData& data) { return true; } -bool Collision::blockToBlock(CollisionData& data) { +/** + * Détermination des informations sur une collision entre + * deux blocs (normale et profondeur de collision) + */ +bool blockToBlock(CollisionData& data) { Block blockA = dynamic_cast(data.objA); Block blockB = dynamic_cast(data.objB); @@ -175,3 +180,24 @@ bool Collision::blockToBlock(CollisionData& data) { return true; } + +/** + * Dictionnaire associant les types impliqués + * dans une collision à leur fonction de résolution + */ +std::map< + std::pair, + std::function +> collision_map = { + {std::make_pair(Player::TYPE_ID, Block::TYPE_ID), playerToBlock}, + {std::make_pair(Block::TYPE_ID, Player::TYPE_ID), blockToPlayer}, + {std::make_pair(Player::TYPE_ID, Player::TYPE_ID), playerToPlayer}, + {std::make_pair(Block::TYPE_ID, Block::TYPE_ID), blockToBlock} +}; + +bool getCollisionData(CollisionData& data) { + return collision_map[std::make_pair( + data.objA.getTypeId(), + data.objB.getTypeId() + )](data); +} diff --git a/src/object.cpp b/src/object.cpp index a1ce098..3043df2 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -102,11 +102,7 @@ bool Object::detectCollision(const Object& obj, CollisionData& data) const { return false; } - return Collision::dispatch[ - // la fonction de détection fine de collision est choisie - // en fonction des types des deux objets en question - std::make_pair(getTypeId(), obj.getTypeId()) - ](data); + return getCollisionData(data); } void Object::solveCollision(Object& obj, const sf::Vector2f& normal) {