From f258e178c6d4de30dea1a5055adafdd65d4db8aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Sat, 9 Apr 2016 00:26:47 +0200 Subject: [PATCH] =?UTF-8?q?Nouvelle=20cam=C3=A9ra=20suivant=20les=20joueur?= =?UTF-8?q?s=20dans=20game?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/game.hpp | 5 +++++ include/level.hpp | 8 +++++++- include/player.hpp | 2 +- src/game.cpp | 49 ++++++++++++++++++++++------------------------ src/level.cpp | 17 +++++++++++++--- src/player.cpp | 17 +++++++++------- 6 files changed, 60 insertions(+), 38 deletions(-) diff --git a/include/game.hpp b/include/game.hpp index 269106b..77b5d32 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -33,6 +33,11 @@ protected: */ virtual void processEvent(const sf::Event& event); + /** + * S'assure que la caméra est centrée sur les joueurs + */ + void ensureCentered(); + public: Game(Manager& manager); virtual ~Game(); diff --git a/include/level.hpp b/include/level.hpp index adf1c02..3a2bc4c 100644 --- a/include/level.hpp +++ b/include/level.hpp @@ -38,7 +38,13 @@ protected: * Convertit les coordonnées à l'écran en coordonnées du monde * d'après la vue caméra */ - sf::Vector2f convertCoords(sf::Vector2i initial); + sf::Vector2f pixelToCoords(sf::Vector2i pixel); + + /** + * Convertit les coordonnées du monde en coordonnées à l'écran + * d'après la vue caméra + */ + sf::Vector2i coordsToPixel(sf::Vector2f coords); public: Level(Manager& manager); diff --git a/include/player.hpp b/include/player.hpp index 13b8fa5..bc5cef7 100644 --- a/include/player.hpp +++ b/include/player.hpp @@ -6,7 +6,7 @@ class Player : public Object { private: - mutable sf::Sprite sprite; + mutable sf::CircleShape sprite; unsigned int player_number; protected: diff --git a/src/game.cpp b/src/game.cpp index aa11ec9..4786c6a 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3,6 +3,8 @@ #include "player.hpp" #include "constants.hpp" +const float CAMERA_TOLERANCE_RATIO = 2.f / 3.f; + Game::Game(Manager& manager) : Level(manager), widget_timer(manager, false), next_frame_time(manager.getCurrentTime()), @@ -29,32 +31,8 @@ void Game::frame() { // on met à jour la physique d'un cran temporel update(); - // on place la caméra à la position médiane des joueurs - // s'ils sont trop éloignés - std::vector& objects = getObjects(); - sf::Vector2f position_first_player; - sf::Vector2f position_second_player; - - for (unsigned int i = 0; i < objects.size(); i++) { - if (Player* player = dynamic_cast(objects[i].get())) { - if (player->getPlayerNumber() == 0) { - position_first_player = player->getPosition(); - } - - if (player->getPlayerNumber() == 1) { - position_second_player = player->getPosition(); - } - } - } - - sf::Vector2f diff = position_second_player - position_first_player; - sf::View camera = getCamera(); - - if (std::pow(diff.x, 2) + std::pow(diff.y, 2) > std::pow(camera.getSize().x / 3, 2)) { - sf::Vector2f middle = (position_second_player + position_first_player) / 2.f; - camera.setCenter(floor(middle.x), floor(middle.y)); - setCamera(camera); - } + // on s'assure que la caméré soit centrée sur nos joueurs + ensureCentered(); // si on a encore suffisamment de temps, on dessine if (current_time < next_frame_time) { @@ -88,6 +66,25 @@ void Game::draw() { widget_timer.draw(sf::Vector2f(window_size.x / 2 - 50, 0)); } +void Game::ensureCentered() { + sf::Vector2i window_size = (sf::Vector2i) manager.getWindow().getSize(); + std::vector& objects = getObjects(); + + sf::Vector2f total_position; + int player_count = 0; + + for (unsigned int i = 0; i < objects.size(); i++) { + if (Player* player = dynamic_cast(objects[i].get())) { + total_position += player->getPosition(); + player_count++; + } + } + + sf::View camera = getCamera(); + camera.setCenter(total_position / (float) player_count); + setCamera(camera); +} + void Game::update() { std::vector colliding; diff --git a/src/level.cpp b/src/level.cpp index f45c2e8..2532298 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -202,15 +202,26 @@ sf::View Level::getCamera() { return camera; } -sf::Vector2f Level::convertCoords(sf::Vector2i initial) { +sf::Vector2f Level::pixelToCoords(sf::Vector2i pixel) { sf::RenderWindow& window = manager.getWindow(); sf::View old_view = window.getView(); window.setView(camera); - sf::Vector2f converted = window.mapPixelToCoords(initial); + sf::Vector2f coords = window.mapPixelToCoords(pixel); window.setView(old_view); - return converted; + return coords; +} + +sf::Vector2i Level::coordsToPixel(sf::Vector2f coords) { + sf::RenderWindow& window = manager.getWindow(); + sf::View old_view = window.getView(); + + window.setView(camera); + sf::Vector2i pixel = window.mapCoordsToPixel(coords); + window.setView(old_view); + + return pixel; } void Level::setCamera(sf::View set_camera) { diff --git a/src/player.cpp b/src/player.cpp index 9ed96d7..76d65a2 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -8,6 +8,9 @@ const unsigned int Player::TYPE_ID = 1; Player::Player() : Object() { // déplacement de l'origine au centre de la balle sprite.setOrigin(sf::Vector2f(getRadius(), getRadius())); + sprite.setRadius(getRadius()); + sprite.setOutlineColor(sf::Color::Black); + sprite.setOutlineThickness(1.5f); } Player::~Player() {} @@ -62,20 +65,20 @@ sf::Vector2f Player::getForces(const Manager& manager, const std::vector