Ajout de fonctions pour le "coarse test" de la collision

This commit is contained in:
Mattéo Delabre 2016-03-13 19:07:35 +01:00
parent 4cc2bfa197
commit 8b8102eeb0
6 changed files with 50 additions and 0 deletions

View File

@ -29,6 +29,11 @@ public:
*/
void draw(sf::RenderWindow& window);
/**
* Récupère la boîte englobante de l'objet
*/
std::unique_ptr<sf::FloatRect> getAABB();
/**
* Détermine la couche d'affichage de l'objet
*/

View File

@ -29,6 +29,11 @@ public:
*/
void update(EngineState& state);
/**
* Récupère la boîte englobante de l'objet
*/
std::unique_ptr<sf::FloatRect> getAABB();
/**
* Détermine la couche d'affichage de l'objet
*/

View File

@ -2,6 +2,7 @@
#define __PTF_OBJECT_HPP__
#include <SFML/Graphics.hpp>
#include <memory>
#include "engine_state.hpp"
class Object {
@ -24,6 +25,11 @@ public:
*/
virtual void update(EngineState& state) = 0;
/**
* Récupère la boîte englobante de l'objet
*/
virtual std::unique_ptr<sf::FloatRect> getAABB() = 0;
/**
* Détermine la couche d'affichage de l'objet
*/

View File

@ -14,6 +14,14 @@ void Ball::draw(sf::RenderWindow& window) {
window.draw(shape);
}
std::unique_ptr<sf::FloatRect> Ball::getAABB() {
return std::unique_ptr<sf::FloatRect>(new sf::FloatRect(
position.x - 10 * mass,
position.y - 10 * mass,
20 * mass, 20 * mass
));
}
sf::Vector2f Ball::getForces(EngineState& state) {
sf::Vector2f forces = PhysicsObject::getForces(state);

View File

@ -23,3 +23,11 @@ void Block::draw(sf::RenderWindow& window) {
void Block::update(EngineState& state) {
// rien à mettre à jour
}
std::unique_ptr<sf::FloatRect> Block::getAABB() {
return std::unique_ptr<sf::FloatRect>(new sf::FloatRect(
position.x - Block::GRID / 2,
position.y - Block::GRID / 2,
Block::GRID, Block::GRID
));
}

View File

@ -48,6 +48,24 @@ void Engine::update() {
for (unsigned int i = 0; i < state.objects.size(); i++) {
state.objects[i]->update(state);
}
// collisions entre objets
for (unsigned int i = 0; i < state.objects.size(); i++) {
Object* objA = state.objects[i];
for (unsigned int j = i + 1; j < state.objects.size(); j++) {
Object* objB = state.objects[j];
// vérifie si on a un risque de collision
if (objA->getAABB()->intersects(*objB->getAABB())) {
// TODO: gestion de la collision =>
// calcul de la normale
// calcul de la profondeur du choc
// si profondeur > 0 :
// résolution de la collision
}
}
}
}
void Engine::draw() {