Amélioration de la méthode d'intégration
This commit is contained in:
parent
c74e23ae28
commit
5ded22e012
|
@ -43,8 +43,8 @@ namespace Constants {
|
|||
* Correction positionnelle : pourcentage de correction
|
||||
* et seuil de correction
|
||||
*/
|
||||
static constexpr float CORRECTION_PERCENTAGE = .5f;
|
||||
static constexpr float CORRECTION_THRESHOLD = .05f;
|
||||
static constexpr float CORRECTION_PERCENTAGE = .8f;
|
||||
static constexpr float CORRECTION_THRESHOLD = .01f;
|
||||
|
||||
/**
|
||||
* Masse par défaut d'un objet
|
||||
|
|
|
@ -41,10 +41,23 @@ public:
|
|||
virtual void draw(sf::RenderWindow& window, ResourceManager& resources);
|
||||
|
||||
/**
|
||||
* Met à jour l'objet juste avant le dessin d'une frame
|
||||
* Reçoit l'état actuel du moteur
|
||||
* Met à jour la vitesse de l'objet selon les
|
||||
* forces qui lui sont appliquées
|
||||
*/
|
||||
virtual void update(EngineState& state);
|
||||
void updateVelocity(EngineState& state, float delta);
|
||||
|
||||
/**
|
||||
* Met à jour la position de l'objet selon sa
|
||||
* vitesse actuelle
|
||||
*/
|
||||
void updatePosition(EngineState& state, float delta);
|
||||
|
||||
/**
|
||||
* Détecte s'il y a collision entre cet objet
|
||||
* et l'objet passé en paramètre et résoud la collision
|
||||
* si elle a lieu
|
||||
*/
|
||||
void collide(Object& obj);
|
||||
|
||||
/**
|
||||
* Récupère la boîte englobante de l'objet
|
||||
|
@ -56,13 +69,6 @@ public:
|
|||
*/
|
||||
virtual unsigned int getTypeId() = 0;
|
||||
|
||||
/**
|
||||
* Détecte s'il y a collision entre cet objet
|
||||
* et l'objet passé en paramètre et résoud la collision
|
||||
* si elle a lieu
|
||||
*/
|
||||
void collide(Object& obj);
|
||||
|
||||
/**
|
||||
* Récupère l'accélération de l'objet
|
||||
*/
|
||||
|
|
|
@ -64,12 +64,7 @@ void Engine::addObject(Object& object) {
|
|||
}
|
||||
|
||||
void Engine::update() {
|
||||
// demande la mise à jour de tous les objets du jeu
|
||||
for (unsigned int i = 0; i < state.objects.size(); i++) {
|
||||
state.objects[i]->update(state);
|
||||
}
|
||||
|
||||
// gère les collisions entre les objets
|
||||
// gestion des collisions entre les objets
|
||||
for (unsigned int i = 0; i < state.objects.size(); i++) {
|
||||
Object* objA = state.objects[i];
|
||||
|
||||
|
@ -78,6 +73,21 @@ void Engine::update() {
|
|||
objA->collide(*objB);
|
||||
}
|
||||
}
|
||||
|
||||
// intégration des forces dans la vitesse (première moitié)
|
||||
for (unsigned int i = 0; i < state.objects.size(); i++) {
|
||||
state.objects[i]->updateVelocity(state, Constants::PHYSICS_TIME / 2);
|
||||
}
|
||||
|
||||
// intégration de la vitesse dans la position
|
||||
for (unsigned int i = 0; i < state.objects.size(); i++) {
|
||||
state.objects[i]->updatePosition(state, Constants::PHYSICS_TIME);
|
||||
}
|
||||
|
||||
// intégration des forces dans la vitesse (seconde moitié)
|
||||
for (unsigned int i = 0; i < state.objects.size(); i++) {
|
||||
state.objects[i]->updateVelocity(state, Constants::PHYSICS_TIME / 2);
|
||||
}
|
||||
}
|
||||
|
||||
void Engine::draw() {
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#include "object.hpp"
|
||||
#include "constants.hpp"
|
||||
#include "collision.hpp"
|
||||
#include <iostream>
|
||||
|
||||
Object::Object(float x, float y) :
|
||||
acceleration(0, 0), velocity(0, 0), position(x, y),
|
||||
|
@ -74,13 +73,13 @@ void Object::draw(sf::RenderWindow& window, ResourceManager& resources) {
|
|||
}
|
||||
}
|
||||
|
||||
void Object::update(EngineState& state) {
|
||||
// intégration des forces appliquées sur l'objet dans la vitesse
|
||||
void Object::updateVelocity(EngineState& state, float delta) {
|
||||
acceleration = getForces(state) * getMassInvert();
|
||||
velocity += acceleration * Constants::PHYSICS_TIME;
|
||||
velocity += acceleration * delta;
|
||||
}
|
||||
|
||||
// intégration de la vitesse dans la position
|
||||
position += velocity * Constants::PHYSICS_TIME;
|
||||
void Object::updatePosition(EngineState& state, float delta) {
|
||||
position += velocity * delta;
|
||||
}
|
||||
|
||||
void Object::collide(Object& obj) {
|
||||
|
@ -105,6 +104,14 @@ void Object::collide(Object& obj) {
|
|||
return;
|
||||
}
|
||||
|
||||
// si les deux objets sont de masse infinie, réinitialisation
|
||||
// des vitesses en tant que collision
|
||||
if (getMassInvert() == 0 && obj.getMassInvert() == 0) {
|
||||
setVelocity(sf::Vector2f(0, 0));
|
||||
obj.setVelocity(sf::Vector2f(0, 0));
|
||||
return;
|
||||
}
|
||||
|
||||
sf::Vector2f rel_velo = obj.getVelocity() - getVelocity();
|
||||
float dot_normal = rel_velo.x * normal.x + rel_velo.y * normal.y;
|
||||
|
||||
|
|
Loading…
Reference in New Issue