Optimisations des collisions
This commit is contained in:
		
							parent
							
								
									3d620bfd11
								
							
						
					
					
						commit
						0af5789c00
					
				|  | @ -22,8 +22,6 @@ struct CollisionData { | |||
| 
 | ||||
|     std::shared_ptr<Object> obj_a; | ||||
|     std::shared_ptr<Object> obj_b; | ||||
| 
 | ||||
|     CollisionData(); | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -101,12 +101,6 @@ public: | |||
|      */ | ||||
|     virtual void updatePosition(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Détecte s'il y a collision entre cet objet | ||||
|      * et l'objet passé en paramètre | ||||
|      */ | ||||
|     virtual bool detectCollision(Object::Ptr obj, CollisionData& data) const; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Résolution de la collision entre cet objet | ||||
|      * et l'objet passé en paramètre selon la normale | ||||
|  |  | |||
|  | @ -186,7 +186,6 @@ namespace { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| CollisionData::CollisionData() {} | ||||
| bool getCollisionData(CollisionData& data) { | ||||
|     CollisionType type_a = data.obj_a->getCollisionType(); | ||||
|     CollisionType type_b = data.obj_b->getCollisionType(); | ||||
|  |  | |||
							
								
								
									
										18
									
								
								src/game.cpp
								
								
								
								
							
							
						
						
									
										18
									
								
								src/game.cpp
								
								
								
								
							|  | @ -191,7 +191,7 @@ void Game::update() { | |||
| 
 | ||||
|         // l'objet est sorti de la zone, on le signale et on
 | ||||
|         // planifie sa mort à la prochaine frame
 | ||||
|         if (!isInZone(obj_a) && obj_a->getMass() != 0) { | ||||
|         if (obj_a->getMass() != 0 && !isInZone(obj_a)) { | ||||
|             kill(obj_a); | ||||
| 
 | ||||
|             // si c'était un joueur, on a perdu
 | ||||
|  | @ -205,12 +205,24 @@ void Game::update() { | |||
|         // d'autres objets
 | ||||
|         for (auto jt = it + 1; jt != objects.end(); jt++) { | ||||
|             Object::Ptr obj_b = *jt; | ||||
|             CollisionData data; | ||||
| 
 | ||||
|             // si les objets ne sont pas sur la même couche,
 | ||||
|             // ils ne peuvent pas entrer en collision
 | ||||
|             if (obj_a->getLayer() != obj_b->getLayer()) { | ||||
|                 continue; | ||||
|             } | ||||
| 
 | ||||
|             // si les deux boîtes englobantes des deux objets ne
 | ||||
|             // s'intersectent pas, il ne risque pas d'y avoir de collision
 | ||||
|             if (!obj_a->getAABB().intersects(obj_b->getAABB())) { | ||||
|                 continue; | ||||
|             } | ||||
| 
 | ||||
|             CollisionData data; | ||||
|             data.obj_a = obj_a; | ||||
|             data.obj_b = obj_b; | ||||
| 
 | ||||
|             if (obj_a->detectCollision(obj_b, data)) { | ||||
|             if (getCollisionData(data)) { | ||||
|                 colliding.push_back(data); | ||||
|             } | ||||
|         } | ||||
|  |  | |||
|  | @ -229,30 +229,6 @@ void Object::updatePosition() { | |||
|     position += velocity * Manager::FRAME_TIME.asSeconds(); | ||||
| } | ||||
| 
 | ||||
| bool Object::detectCollision(Object::Ptr obj, CollisionData& data) const { | ||||
|     // si les objets ne sont pas sur la même couche,
 | ||||
|     // ils ne peuvent pas entrer en collision
 | ||||
|     if (getLayer() != obj->getLayer()) { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     // si on a affaire à deux objets de masse infinie et
 | ||||
|     // de vitesse nulle, pas de collision
 | ||||
|     if (getMassInvert() == 0 && obj->getMassInvert() == 0 && | ||||
|         getVelocity().x == 0 && getVelocity().y == 0 && | ||||
|         obj->getVelocity().x == 0 && obj->getVelocity().y == 0) { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     // si les deux boîtes englobantes des deux objets ne
 | ||||
|     // s'intersectent pas, il ne risque pas d'y avoir de collision
 | ||||
|     if (!getAABB().intersects(obj->getAABB())) { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     return getCollisionData(data); | ||||
| } | ||||
| 
 | ||||
| void Object::solveCollision(Game& game, Object::Ptr obj, const sf::Vector2f& normal) { | ||||
|     // si les deux objets sont de masse infinie, réinitialisation
 | ||||
|     // des vitesses en tant que collision
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue