From bf66ba4dbbe165736a6075d8a0be2cd22fd8bf6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Sat, 9 Apr 2016 04:36:30 +0200 Subject: [PATCH] Meilleure encapsulation du manager et passage de level --- include/block.hpp | 2 +- include/level.hpp | 12 +++++++++++- include/object.hpp | 10 ++++++---- include/player.hpp | 6 +++--- include/view.hpp | 24 +++++++++++++++++++++++- src/block.cpp | 7 ++++--- src/editor.cpp | 18 +++++++++--------- src/game.cpp | 15 +++++++-------- src/level.cpp | 27 +++++++++++++++++---------- src/menu.cpp | 22 +++++++++++----------- src/object.cpp | 18 ++++++++---------- src/player.cpp | 23 ++++++++++++----------- src/view.cpp | 18 ++++++++++++++++++ 13 files changed, 130 insertions(+), 72 deletions(-) diff --git a/include/block.hpp b/include/block.hpp index 49be13a..7dedbfb 100644 --- a/include/block.hpp +++ b/include/block.hpp @@ -31,7 +31,7 @@ public: /** * Dessin du bloc dans la fenêtre donnée */ - virtual void draw(Manager& manager); + virtual void draw(Level& level); /** * Appelé lorsque le bloc est activé par un objet diff --git a/include/level.hpp b/include/level.hpp index 8e93d81..214273b 100644 --- a/include/level.hpp +++ b/include/level.hpp @@ -108,15 +108,25 @@ public: */ std::vector& getObjects(); + /** + * Récupère la liste des objets (version constante) + */ + const std::vector& getObjects() const; + /** * Récupère la zone du niveau */ std::vector>& getZone(); + /** + * Récupère la zone du niveau (version constante) + */ + const std::vector>& getZone() const; + /** * Récupère la caméra actuelle */ - sf::View getCamera(); + sf::View getCamera() const; /** * Modifie la caméra diff --git a/include/object.hpp b/include/object.hpp index 3d427fa..61e8e0f 100644 --- a/include/object.hpp +++ b/include/object.hpp @@ -10,6 +10,8 @@ typedef std::shared_ptr ObjectPtr; +class Level; + class Object { private: sf::Vector2f acceleration; @@ -30,7 +32,7 @@ protected: /** * Calcule les forces appliquées à l'objet */ - virtual sf::Vector2f getForces(const Manager& manager, const std::vector& objects) const; + virtual sf::Vector2f getForces(const Level& level) const; public: /** @@ -59,7 +61,7 @@ public: /** * Dessine l'objet dans la fenêtre donnée */ - virtual void draw(Manager& manager) = 0; + virtual void draw(Level& level) = 0; /** * Appelé lorsque l'objet est activé par un autre @@ -81,13 +83,13 @@ public: * Met à jour la vitesse de l'objet selon les * forces qui lui sont appliquées */ - virtual void updateVelocity(const Manager& manager, const std::vector& objects, float delta); + virtual void updateVelocity(const Level& level); /** * Met à jour la position de l'objet selon sa * vitesse actuelle */ - virtual void updatePosition(float delta); + virtual void updatePosition(); /** * Détecte s'il y a collision entre cet objet diff --git a/include/player.hpp b/include/player.hpp index b31957e..36ec109 100644 --- a/include/player.hpp +++ b/include/player.hpp @@ -13,7 +13,7 @@ protected: /** * Calcule les forces appliquées au joueur */ - virtual sf::Vector2f getForces(const Manager& manager, const std::vector& objects) const; + virtual sf::Vector2f getForces(const Level& level) const; public: /** @@ -37,7 +37,7 @@ public: /** * Dessine le joueur dans la fenêtre donnée */ - virtual void draw(Manager& manager); + virtual void draw(Level& manager); /** * Appelé lorsque le joueur est activé par un objet @@ -58,7 +58,7 @@ public: * Met à jour la position de l'objet selon sa * vitesse actuelle */ - virtual void updatePosition(float delta); + virtual void updatePosition(); /** * Renvoie le rayon de la balle du joueur diff --git a/include/view.hpp b/include/view.hpp index f0ad84b..79babce 100644 --- a/include/view.hpp +++ b/include/view.hpp @@ -3,6 +3,7 @@ #include +class ResourceManager; class Manager; class Object; @@ -10,9 +11,10 @@ class Object; * Classe abstraite pour les vues */ class View { -protected: +private: Manager& manager; +protected: /** * Traite l'événement donné */ @@ -32,6 +34,26 @@ public: * Demande le passage à la frame suivante sur cette vue */ virtual void frame(const std::vector& events); + + /** + * Récupère le gestionnaire + */ + Manager& getManager(); + + /** + * Récupère le gestionnaire de ressources + */ + ResourceManager& getResourceManager(); + + /** + * Récupère la fenêtre + */ + sf::RenderWindow& getWindow(); + + /** + * Récupère si une touche est pressée + */ + bool isKeyPressed(sf::Keyboard::Key key) const; }; #endif diff --git a/src/block.cpp b/src/block.cpp index ce6215a..a62f05b 100644 --- a/src/block.cpp +++ b/src/block.cpp @@ -1,4 +1,5 @@ #include "block.hpp" +#include "level.hpp" #include "player.hpp" #include "constants.hpp" #include "resource_manager.hpp" @@ -31,10 +32,10 @@ ObjectPtr Block::load(std::ifstream& file) { return object; } -void Block::draw(Manager& manager) { +void Block::draw(Level& level) { // utilisation de la texture - ResourceManager& resources = manager.getResourceManager(); - sf::RenderWindow& window = manager.getWindow(); + ResourceManager& resources = level.getResourceManager(); + sf::RenderWindow& window = level.getWindow(); sprite.setTexture(resources.getTexture("block.png")); select_sprite.setTexture(resources.getTexture("block_select.png")); diff --git a/src/editor.cpp b/src/editor.cpp index 9521035..21149ce 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -17,7 +17,7 @@ Editor::Editor(Manager& manager) : Level(manager), drag_mode(DragMode::NONE), setName("Nouveau niveau"); setTotalTime(30); - ResourceManager& resources = manager.getResourceManager(); + ResourceManager& resources = getResourceManager(); std::shared_ptr basic = widget_selector.addCategory("BASE"); basic->addItem("Block", resources.getTexture("block.png")); basic->addItem("Player", resources.getTexture("player.tga")); @@ -27,7 +27,7 @@ Editor::~Editor() {} void Editor::begin() { Level::begin(); - manager.getWindow().setFramerateLimit(60); + getWindow().setFramerateLimit(60); } void Editor::frame(const std::vector& events) { @@ -35,7 +35,7 @@ void Editor::frame(const std::vector& events) { Level::frame(events); // titre de la fenêtre - manager.setTitle(sf::String(L"Édition de ") + getName()); + getManager().setTitle(sf::String(L"Édition de ") + getName()); // dessin de la frame draw(); @@ -62,7 +62,7 @@ void Editor::processEvent(const sf::Event& event) { if (event.mouseButton.button == sf::Mouse::Left) { // clic + shift : sélection par rectangle de sélection - if (manager.isKeyPressed(sf::Keyboard::LShift)) { + if (isKeyPressed(sf::Keyboard::LShift)) { drag_start = mouse_position; drag_end = mouse_position; drag_mode = DragMode::SELECT_RECT; @@ -70,7 +70,7 @@ void Editor::processEvent(const sf::Event& event) { // clic sur un objet : démarrage de la sélection libre else if (pointed_object != nullptr) { - if (manager.isKeyPressed(sf::Keyboard::LControl)) { + if (isKeyPressed(sf::Keyboard::LControl)) { drag_start = mouse_position; drag_end = mouse_position; drag_mode = DragMode::SELECT_BULK; @@ -165,7 +165,7 @@ void Editor::processEvent(const sf::Event& event) { } void Editor::draw() { - sf::RenderWindow& window = manager.getWindow(); + sf::RenderWindow& window = getWindow(); sf::Vector2i window_size = (sf::Vector2i) window.getSize(); // scroll de la caméra lorsque la souris se situe sur les bords @@ -348,7 +348,7 @@ void Editor::selectAll() { } void Editor::test() { - std::shared_ptr game = std::shared_ptr(new Game(manager)); + std::shared_ptr game = std::shared_ptr(new Game(getManager())); clearSelection(); // copie des propriétés @@ -371,6 +371,6 @@ void Editor::test() { } // mise en mode test - game->setTestMode(manager.getView()); - manager.setView(game); + game->setTestMode(getManager().getView()); + getManager().setView(game); } diff --git a/src/game.cpp b/src/game.cpp index 6295d58..459d7a1 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -14,7 +14,7 @@ Game::~Game() {} void Game::begin() { Level::begin(); - manager.getWindow().setFramerateLimit(0); + getWindow().setFramerateLimit(0); } void Game::frame(const std::vector& events) { @@ -22,9 +22,8 @@ void Game::frame(const std::vector& events) { Level::frame(events); // titre de la fenêtre - manager.setTitle(getName()); - - sf::Time current_time = manager.getCurrentTime(); + getManager().setTitle(getName()); + sf::Time current_time = getManager().getCurrentTime(); if (current_time >= next_frame_time) { // si nous sommes en retard ou dans les temps @@ -54,12 +53,12 @@ void Game::processEvent(const sf::Event& event) { // appui sur espace en mode test : retour à l'éditeur if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space && test_mode) { test_mode = false; - manager.setView(return_view); + getManager().setView(return_view); } } void Game::draw() { - sf::Vector2i window_size = (sf::Vector2i) manager.getWindow().getSize(); + sf::Vector2i window_size = (sf::Vector2i) getWindow().getSize(); // dessin des objets du niveau Level::draw(); @@ -106,7 +105,7 @@ void Game::update() { // intégration des forces dans la vitesse (seconde moitié) for (unsigned int i = 0; i < getObjects().size(); i++) { - getObjects()[i]->updateVelocity(manager, getObjects(), Constants::PHYSICS_TIME.asSeconds() / 2); + getObjects()[i]->updateVelocity(*this); } // résolution des collisions détectées @@ -117,7 +116,7 @@ void Game::update() { // intégration de la vitesse dans la position for (unsigned int i = 0; i < getObjects().size(); i++) { - getObjects()[i]->updatePosition(Constants::PHYSICS_TIME.asSeconds()); + getObjects()[i]->updatePosition(); } // application de la correction positionnelle diff --git a/src/level.cpp b/src/level.cpp index b5307f9..fcc0769 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -77,11 +77,10 @@ void Level::load(std::ifstream& file) { // lecture des chemins de la musique et du fond std::string background_name; - ResourceManager& resource_manager = manager.getResourceManager(); std::getline(file, music_name, '\0'); std::getline(file, background_name, '\0'); - background.setTexture(resource_manager.getTexture(background_name)); + background.setTexture(getResourceManager().getTexture(background_name)); // lecture du nombre de blocs int block_count; @@ -110,9 +109,9 @@ void Level::save() { } void Level::begin() { - ResourceManager& resources = manager.getResourceManager(); + ResourceManager& resources = getResourceManager(); - camera = manager.getWindow().getDefaultView(); + camera = getWindow().getDefaultView(); camera.setCenter(0, 0); if (music_name != "") { @@ -137,7 +136,7 @@ void Level::processEvent(const sf::Event& event) { } void Level::draw() { - sf::RenderWindow& window = manager.getWindow(); + sf::RenderWindow& window = getWindow(); // passage sur la vue caméra window.setView(camera); @@ -155,12 +154,12 @@ void Level::draw() { // dessin des objets de la file d'affichage couche par couche while (!display_queue.empty()) { - display_queue.top()->draw(manager); + display_queue.top()->draw(*this); display_queue.pop(); } // passage sur la vue par défaut - manager.resetDefaultView(); + getManager().resetDefaultView(); } sf::String Level::getName() const { @@ -195,16 +194,24 @@ std::vector& Level::getObjects() { return objects; } +const std::vector& Level::getObjects() const { + return objects; +} + std::vector>& Level::getZone() { return zone; } -sf::View Level::getCamera() { +const std::vector>& Level::getZone() const { + return zone; +} + +sf::View Level::getCamera() const { return camera; } sf::Vector2f Level::pixelToCoords(sf::Vector2i pixel) { - sf::RenderWindow& window = manager.getWindow(); + sf::RenderWindow& window = getWindow(); sf::View old_view = window.getView(); window.setView(camera); @@ -215,7 +222,7 @@ sf::Vector2f Level::pixelToCoords(sf::Vector2i pixel) { } sf::Vector2i Level::coordsToPixel(sf::Vector2f coords) { - sf::RenderWindow& window = manager.getWindow(); + sf::RenderWindow& window = getWindow(); sf::View old_view = window.getView(); window.setView(camera); diff --git a/src/menu.cpp b/src/menu.cpp index 313d2b8..4012009 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -9,13 +9,13 @@ Menu::Menu(Manager& manager) : View(manager) {} Menu::~Menu() {} void Menu::begin() { - ResourceManager& resources = manager.getResourceManager(); + ResourceManager& resources = getResourceManager(); loadMainMenu(); resources.setMusic("menu.wav"); resources.playMusic(); - manager.getWindow().setFramerateLimit(60); + getWindow().setFramerateLimit(60); } void Menu::frame(const std::vector& events) { @@ -23,14 +23,14 @@ void Menu::frame(const std::vector& events) { View::frame(events); // titre de la fenêtitre - manager.setTitle(""); + getManager().setTitle(""); // affichage du menu - sf::RenderWindow& window = manager.getWindow(); + sf::RenderWindow& window = getWindow(); sf::Vector2f size = (sf::Vector2f) window.getSize(); - sf::Font font = manager.getResourceManager().getFont("raleway.ttf"); + sf::Font font = getResourceManager().getFont("raleway.ttf"); - manager.resetDefaultView(); + getManager().resetDefaultView(); window.clear(sf::Color(66, 40, 245)); // TODO: dessiner l'image du fond @@ -164,12 +164,12 @@ void Menu::loadRules() { } void Menu::launchEditor() { - std::shared_ptr editor = std::shared_ptr(new Editor(manager)); - manager.setView(editor); + std::shared_ptr editor = std::shared_ptr(new Editor(getManager())); + getManager().setView(editor); } void Menu::launchGame(std::string name) { - std::shared_ptr game = std::shared_ptr(new Game(manager)); + std::shared_ptr game = std::shared_ptr(new Game(getManager())); std::string path = "./levels/" + name; std::ifstream file; @@ -177,9 +177,9 @@ void Menu::launchGame(std::string name) { game->load(file); file.close(); - manager.setView(game); + getManager().setView(game); } void Menu::quit() { - manager.quit(); + getManager().quit(); } diff --git a/src/object.cpp b/src/object.cpp index c6a4bfb..ca35960 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1,4 +1,5 @@ #include "object.hpp" +#include "level.hpp" #include "constants.hpp" #include "collision.hpp" #include @@ -85,10 +86,9 @@ void Object::load(std::ifstream& file, ObjectPtr object) { } } -sf::Vector2f Object::getForces( - const Manager& manager, const std::vector& objects -) const { +sf::Vector2f Object::getForces(const Level& level) const { sf::Vector2f forces(0, 0); + const std::vector& objects = level.getObjects(); // force de gravité forces += sf::Vector2f(0, getMass() * Constants::GRAVITY); @@ -129,15 +129,13 @@ sf::Vector2f Object::getForces( return forces; } -void Object::updateVelocity( - const Manager& manager, const std::vector& objects, float delta -) { - acceleration = getForces(manager, objects) * getMassInvert(); - velocity += acceleration * delta; +void Object::updateVelocity(const Level& level) { + acceleration = getForces(level) * getMassInvert(); + velocity += acceleration * Constants::PHYSICS_TIME.asSeconds(); } -void Object::updatePosition(float delta) { - position += velocity * delta; +void Object::updatePosition() { + position += velocity * Constants::PHYSICS_TIME.asSeconds(); } bool Object::detectCollision(const Object& obj, CollisionData& data) const { diff --git a/src/player.cpp b/src/player.cpp index 6cdc9f0..a9114d4 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -1,4 +1,5 @@ #include "player.hpp" +#include "level.hpp" #include "block.hpp" #include "constants.hpp" #include @@ -35,26 +36,26 @@ ObjectPtr Player::load(std::ifstream& file) { return object; } -sf::Vector2f Player::getForces(const Manager& manager, const std::vector& objects) const { - sf::Vector2f forces = Object::getForces(manager, objects); +sf::Vector2f Player::getForces(const Level& level) const { + sf::Vector2f forces = Object::getForces(level); // déplacement de la balle après appui sur les touches de direction if (getPlayerNumber() == 0) { - if (manager.isKeyPressed(sf::Keyboard::Left)) { + if (level.isKeyPressed(sf::Keyboard::Left)) { forces += sf::Vector2f(-Constants::MOVE, 0); } - if (manager.isKeyPressed(sf::Keyboard::Right)) { + if (level.isKeyPressed(sf::Keyboard::Right)) { forces += sf::Vector2f(Constants::MOVE, 0); } } if (getPlayerNumber() == 1) { - if (manager.isKeyPressed(sf::Keyboard::Q)) { + if (level.isKeyPressed(sf::Keyboard::Q)) { forces += sf::Vector2f(-Constants::MOVE, 0); } - if (manager.isKeyPressed(sf::Keyboard::D)) { + if (level.isKeyPressed(sf::Keyboard::D)) { forces += sf::Vector2f(Constants::MOVE, 0); } } @@ -62,10 +63,10 @@ sf::Vector2f Player::getForces(const Manager& manager, const std::vector& events) { processEvent(events[i]); } } + +Manager& View::getManager() { + return manager; +} + +// raccourcis vers des méthodes du gestionnaire +ResourceManager& View::getResourceManager() { + return manager.getResourceManager(); +} + +sf::RenderWindow& View::getWindow() { + return manager.getWindow(); +} + +bool View::isKeyPressed(sf::Keyboard::Key key) const { + return manager.isKeyPressed(key); +}