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
 | ||||
| } | ||||
| 
 | ||||
| void Ball::update(sf::Vector2f forces, float delta) { | ||||
|     // TODO: implémenter cette fonction
 | ||||
| } | ||||
| 
 | ||||
| void Ball::draw(sf::RenderWindow& window) { | ||||
|     // 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 <cmath> | ||||
| #include <queue> | ||||
| 
 | ||||
| /**
 | ||||
|  * Fonction d'initialisation de la classe Engine | ||||
|  | @ -54,68 +55,40 @@ Engine::Engine() { | |||
| 
 | ||||
|         // réinitialise l'horloge à zéro
 | ||||
|         // et stocke la différence de temps dans delta
 | ||||
|         float delta = clock.restart().asSeconds(); | ||||
|         update(delta); | ||||
|         State state; | ||||
|         state.delta = clock.restart().asSeconds(); | ||||
|         state.goLeftKey = goLeftKey; | ||||
|         state.goRightKey = goRightKey; | ||||
|         state.objects = objects; | ||||
| 
 | ||||
|         update(state); | ||||
|         draw(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Mise à jour de la physique du jeu | ||||
|  */ | ||||
| void Engine::update(float 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); | ||||
| void Engine::update(State state) { | ||||
|     // demande la mise à jour de tous les objets du jeu
 | ||||
|     for (int i = 0; i < objects.size(); i++) { | ||||
|         objects[i]->update(state, delta); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Dessine la scène du jeu couche par couche | ||||
|  */ | ||||
| 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)); | ||||
| 
 | ||||
|     // grille de blocs
 | ||||
|     for (int i = 0; i < blocks.size(); i++) { | ||||
|         blocks[i].draw(); | ||||
|     // chargement de la file d'affichage des objets
 | ||||
|     typedef std::unique_ptr<Object> ObjectPtr; | ||||
|     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
 | ||||
|     for (int i = 0; i < balls.size(); i++) { | ||||
|         balls[i].draw(); | ||||
|     // dessin des objets de la file d'affichage couche par couche
 | ||||
|     unsigned int layer = 0; | ||||
| 
 | ||||
|     while (!display_queue.empty()) { | ||||
|         display_queue.pop()->draw(window); | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue