void Unit::OnCollide(Entity& entity, const sf::FloatRect& overlap) { if (IsDying() || entity.IsDying()) { return; } switch (entity.GetCollideEffect()) { case FX_REJECTION: // repoussement horizontal ? if (overlap.GetHeight() < overlap.GetWidth()) { // vers le haut ou le bas knocked_dir_ = entity.GetPosition().y > GetPosition().y ? UP : DOWN; } else // vertical { // vers la gauche ou la droite knocked_dir_ = entity.GetPosition().x > GetPosition().x ? LEFT : RIGHT; } knocked_start_ = Game::GetInstance().GetElapsedTime(); knocked_speed_ = KNOCK_INITIAL_SPEED; is_knocked_ = true; break; case FX_STOP: { Direction dir; float dist; if (overlap.GetHeight() < overlap.GetWidth()) { dir = entity.GetPosition().y > GetPosition().y ? UP : DOWN; dist = overlap.GetHeight(); } else { dir = entity.GetPosition().x > GetPosition().x ? LEFT : RIGHT; dist = overlap.GetWidth(); } Move(dir, dist); } break; case FX_NOTING: break; } }
sf::Vector2f CollisionResolver::resolve_inside_bounds(const sf::FloatRect& within, const sf::FloatRect& bounds) { sf::Vector2f resolved_position(within.Left,within.Top); if(within.Left < bounds.Left) { resolved_position.x = bounds.Left; } if(within.Left + within.GetWidth() > bounds.Left + bounds.GetWidth()) { resolved_position.x = bounds.Left + bounds.GetWidth() - within.GetWidth(); } if(within.Top < bounds.Top) { resolved_position.y = bounds.Top; } if(within.Top + within.GetHeight() > bounds.Top + bounds.GetHeight()) { resolved_position.y = bounds.Top + bounds.GetHeight() - within.GetHeight(); } return resolved_position; }