Délégation du calcul des forces aux balles
Et implémentation du file de priorité de couches pour le dessin des objets
This commit is contained in:
parent
c75cf288c1
commit
d072686b0c
50
ball.cpp
50
ball.cpp
|
@ -4,10 +4,52 @@ Ball::Ball() {
|
||||||
// TODO: implémenter cette fonction
|
// TODO: implémenter cette fonction
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ball::update(sf::Vector2f forces, float delta) {
|
|
||||||
// TODO: implémenter cette fonction
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ball::draw(sf::RenderWindow& window) {
|
void Ball::draw(sf::RenderWindow& window) {
|
||||||
// TODO: implémenter cette fonction
|
// TODO: implémenter cette fonction
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sf::Vector2f Ball::getForces(State state) {
|
||||||
|
sf::Vector2f forces = PhysicsObject::getForces(state);
|
||||||
|
|
||||||
|
// déplacement de la balle après appui sur les touches de direction
|
||||||
|
if (state.goLeftKey) {
|
||||||
|
forces += sf::Vector2f(-Engine::MOVE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.goRightKey) {
|
||||||
|
forces += sf::Vector2f(Engine::MOVE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// force d'attraction entre les balles et les blocs chargés
|
||||||
|
if (getCharge() != 0) {
|
||||||
|
for (int j = 0; j < state.objects.size(); j++) {
|
||||||
|
Object attractiveObject = *objects[j];
|
||||||
|
|
||||||
|
if (i == j || attractiveObject.getCharge() == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// vecteur allant de l'objet attirant vers l'objet considéré
|
||||||
|
sf::Vector2f attraction(
|
||||||
|
attractiveObject.getPosition() -
|
||||||
|
object.getPosition()
|
||||||
|
);
|
||||||
|
|
||||||
|
// la norme de ce vecteur est la distance entre les objets
|
||||||
|
float distanceSquared = attraction.x * attraction.x +
|
||||||
|
attraction.y * attraction.y;
|
||||||
|
|
||||||
|
// normalisation du vecteur direction qui porte
|
||||||
|
// la force d'attraction, puis application de la norme
|
||||||
|
attraction /= std::sqrt(distanceSquared);
|
||||||
|
attraction *= Engine::ATTRACTION * (
|
||||||
|
(objects[i].getCharge() * objects[j].getCharge()) /
|
||||||
|
distanceSquared
|
||||||
|
);
|
||||||
|
|
||||||
|
forces += attraction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return forces;
|
||||||
|
}
|
||||||
|
|
75
engine.cpp
75
engine.cpp
|
@ -1,5 +1,6 @@
|
||||||
#include "engine.hpp"
|
#include "engine.hpp"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fonction d'initialisation de la classe Engine
|
* Fonction d'initialisation de la classe Engine
|
||||||
|
@ -54,68 +55,40 @@ Engine::Engine() {
|
||||||
|
|
||||||
// réinitialise l'horloge à zéro
|
// réinitialise l'horloge à zéro
|
||||||
// et stocke la différence de temps dans delta
|
// et stocke la différence de temps dans delta
|
||||||
float delta = clock.restart().asSeconds();
|
State state;
|
||||||
update(delta);
|
state.delta = clock.restart().asSeconds();
|
||||||
|
state.goLeftKey = goLeftKey;
|
||||||
|
state.goRightKey = goRightKey;
|
||||||
|
state.objects = objects;
|
||||||
|
|
||||||
|
update(state);
|
||||||
draw();
|
draw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
void Engine::update(State state) {
|
||||||
* Mise à jour de la physique du jeu
|
// demande la mise à jour de tous les objets du jeu
|
||||||
*/
|
for (int i = 0; i < objects.size(); i++) {
|
||||||
void Engine::update(float delta) {
|
objects[i]->update(state, delta);
|
||||||
for (int i = 0; i < balls.size(); i++) {
|
|
||||||
sf::Vector2f forces(0, 0);
|
|
||||||
|
|
||||||
// force de gravité
|
|
||||||
forces += sf::Vector2f(0, Engine::GRAVITY);
|
|
||||||
|
|
||||||
// déplacement de la balle après appui sur les touches de direction
|
|
||||||
if (goLeftKey) {
|
|
||||||
forces += sf::Vector2f(-Engine::MOVE, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (goRightKey) {
|
|
||||||
forces += sf::Vector2f(Engine::MOVE, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// force d'attraction entre les balles et les blocs
|
|
||||||
for (int j = 0; j < balls.size(); j++) {
|
|
||||||
if (i != j && balls[i].getCharge() && balls[j].getCharge()) {
|
|
||||||
sf::Vector2f attraction(balls[i].getPosition() - balls[j].getPosition());
|
|
||||||
float distanceSquared = attraction.x * attraction.x + attraction.y * attraction.y;
|
|
||||||
|
|
||||||
// normalisation du vecteur direction qui porte la force d'attraction
|
|
||||||
attraction /= std::sqrt(distanceSquared);
|
|
||||||
attraction *= Engine::ATTRACTION * (
|
|
||||||
(balls[i].getCharge() * balls[j].getCharge()) /
|
|
||||||
distanceSquared
|
|
||||||
);
|
|
||||||
|
|
||||||
forces += attraction;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: COLLISIONS
|
|
||||||
|
|
||||||
balls[i].update(forces, delta);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dessine la scène du jeu couche par couche
|
|
||||||
*/
|
|
||||||
void Engine::draw() {
|
void Engine::draw() {
|
||||||
// couche de fond
|
// efface la scène précédente et dessine la couche de fond
|
||||||
window.clear(sf::Color(66, 165, 245));
|
window.clear(sf::Color(66, 165, 245));
|
||||||
|
|
||||||
// grille de blocs
|
// chargement de la file d'affichage des objets
|
||||||
for (int i = 0; i < blocks.size(); i++) {
|
typedef std::unique_ptr<Object> ObjectPtr;
|
||||||
blocks[i].draw();
|
std::priority_queue<ObjectPtr, std::vector<ObjectPtr>, CompareObjectLayer> display_queue;
|
||||||
|
|
||||||
|
for (int i = 0; i < objects.size(); i++) {
|
||||||
|
display_queue.push(objects[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// dessin des balles
|
// dessin des objets de la file d'affichage couche par couche
|
||||||
for (int i = 0; i < balls.size(); i++) {
|
unsigned int layer = 0;
|
||||||
balls[i].draw();
|
|
||||||
|
while (!display_queue.empty()) {
|
||||||
|
display_queue.pop()->draw(window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue