From 201b99b24aecbd69e5d315d528166567d4306669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Sun, 10 Apr 2016 21:18:21 +0200 Subject: [PATCH] =?UTF-8?q?attribution=20automatique=20des=20num=C3=A9ros?= =?UTF-8?q?=20de=20joueurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/level.hpp | 24 ++++++++++++++++++- res/levels/level1.dat | Bin 344 -> 342 bytes src/editor.cpp | 25 +++++++------------- src/game.cpp | 33 ++++++++++++-------------- src/level.cpp | 53 +++++++++++++++++++++++++++++++++++++++--- src/player.cpp | 9 ------- 6 files changed, 96 insertions(+), 48 deletions(-) diff --git a/include/level.hpp b/include/level.hpp index 0a3cbca..bfc12fe 100644 --- a/include/level.hpp +++ b/include/level.hpp @@ -5,6 +5,7 @@ #include #include "state.hpp" #include "object.hpp" +#include "player.hpp" #include "manager.hpp" #include "resource_manager.hpp" @@ -30,6 +31,7 @@ private: std::string music; std::vector objects; + std::vector players; std::vector zone; protected: @@ -146,10 +148,30 @@ public: std::vector& getObjects(); /** - * Récupère la liste des objets (version constante) + * Récupère la liste des objets (constante) */ const std::vector& getObjects() const; + /** + * Récupère la liste des joueurs + */ + std::vector& getPlayers(); + + /** + * Récupère la liste des joueurs (constante) + */ + const std::vector& getPlayers() const; + + /** + * Ajoute un nouvel objet + */ + void addObject(Object::Ptr object); + + /** + * Supprime l'objet donné + */ + void removeObject(Object::Ptr object); + /** * Récupère la zone du niveau */ diff --git a/res/levels/level1.dat b/res/levels/level1.dat index 72e63c03d444fb22019ba5613afb3c63f28ab57d..4dea15b53513fe5ececd856fa89f5c13a4f176bf 100644 GIT binary patch delta 22 ecmcb?bd703Fi(O51A~Gi)7dj;_A*RN{0;zF4hXOS delta 24 gcmcb{bc1O^FdsvL0|SGCBh%S4XZA8MPK^H!0AiO2u>b%7 diff --git a/src/editor.cpp b/src/editor.cpp index 4ded761..b9d7574 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -189,12 +189,8 @@ void Editor::processEvent(const sf::Event& event) { if (event.type == sf::Event::KeyPressed) { // appui sur suppr : suppression des blocs sélectionnés if (event.key.code == sf::Keyboard::Delete) { - std::vector& objects = getObjects(); - for (unsigned int i = 0; i < selection.size(); i++) { - objects.erase(std::remove( - objects.begin(), objects.end(), selection[i] - ), objects.end()); + removeObject(selection[i]); } clearSelection(); @@ -299,7 +295,7 @@ void Editor::draw() { } Object::Ptr Editor::getObject(sf::Vector2f position) { - std::vector& objects = getObjects(); + const std::vector& objects = getObjects(); for (unsigned int i = 0; i < objects.size(); i++) { if (objects[i]->getAABB().contains(position)) { @@ -323,7 +319,7 @@ sf::Vector2f* Editor::getControlPoint(sf::Vector2f position) { } Object::Ptr Editor::addObject(sf::Vector2f position) { - std::vector& objects = getObjects(); + const std::vector& objects = getObjects(); // on arrondit à l'unité de grille la plus proche position = roundVectorToGrid(position); @@ -346,7 +342,7 @@ Object::Ptr Editor::addObject(sf::Vector2f position) { } if (!overlaps) { - objects.push_back(object); + Level::addObject(object); return object; } @@ -358,17 +354,12 @@ void Editor::removeObject(Object::Ptr object) { return; } - std::vector& objects = getObjects(); - // on supprime l'objet de la sélection selection.erase(std::remove( selection.begin(), selection.end(), object ), selection.end()); - // on supprime l'objet de la liste d'objets - objects.erase(std::remove( - objects.begin(), objects.end(), object - ), objects.end()); + Level::removeObject(object); } void Editor::removeControlPoint(sf::Vector2f* control_point) { @@ -421,7 +412,7 @@ void Editor::select(sf::Vector2f position, Editor::SelectionMode mode) { } void Editor::select(sf::Vector2f top_left, sf::Vector2f bottom_right) { - std::vector& objects = getObjects(); + const std::vector& objects = getObjects(); sf::FloatRect selection_rect( std::min(top_left.x, bottom_right.x), std::min(top_left.y, bottom_right.y), @@ -448,7 +439,7 @@ void Editor::clearSelection() { } void Editor::selectAll() { - std::vector& objects = getObjects(); + const std::vector& objects = getObjects(); for (unsigned int i = 0; i < objects.size(); i++) { objects[i]->setSelected(true); @@ -470,7 +461,7 @@ void Editor::test() { std::vector& objects = getObjects(); for (unsigned int i = 0; i < objects.size(); i++) { - game->getObjects().push_back(objects[i]->clone()); + game->addObject(objects[i]->clone()); } // copie de la zone de jeu diff --git a/src/game.cpp b/src/game.cpp index e2691bd..fbedf84 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -91,19 +91,15 @@ void Game::draw() { } void Game::ensureCentered() { - std::vector& objects = getObjects(); + std::vector& players = getPlayers(); 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(); + unsigned int player_count = players.size(); + + for (unsigned int i = 0; i < player_count; i++) { + total_position += players[i]->getPosition(); + } if (player_count == 0) { // on évite la division par zéro @@ -118,13 +114,14 @@ void Game::ensureCentered() { void Game::update() { std::vector colliding; + std::vector& objects = getObjects(); // détection des objets en collision - for (unsigned int i = 0; i < getObjects().size(); i++) { - Object::Ptr obj_a = getObjects()[i]; + for (unsigned int i = 0; i < objects.size(); i++) { + Object::Ptr obj_a = objects[i]; - for (unsigned int j = i + 1; j < getObjects().size(); j++) { - Object::Ptr obj_b = getObjects()[j]; + for (unsigned int j = i + 1; j < objects.size(); j++) { + Object::Ptr obj_b = objects[j]; CollisionData data(*obj_a, *obj_b); if (obj_a->detectCollision(*obj_b, data)) { @@ -134,8 +131,8 @@ void Game::update() { } // intégration des forces dans la vitesse (seconde moitié) - for (unsigned int i = 0; i < getObjects().size(); i++) { - getObjects()[i]->updateVelocity(*this); + for (unsigned int i = 0; i < objects.size(); i++) { + objects[i]->updateVelocity(*this); } // résolution des collisions détectées @@ -145,8 +142,8 @@ void Game::update() { } // intégration de la vitesse dans la position - for (unsigned int i = 0; i < getObjects().size(); i++) { - getObjects()[i]->updatePosition(); + for (unsigned int i = 0; i < objects.size(); i++) { + objects[i]->updatePosition(); } // application de la correction positionnelle diff --git a/src/level.cpp b/src/level.cpp index 835f4a7..98d87b6 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -126,7 +126,13 @@ void Level::load(std::string filename) { } // lecture de l'objet - objects.push_back(object_type_map[object_type](file)); + Object::Ptr read_object = object_type_map[object_type](file); + objects.push_back(read_object); + + // si c'est un joueur, on l'ajoute à la liste + if ((unsigned int) object_type == Player::TYPE_ID) { + players.push_back(std::dynamic_pointer_cast(read_object)); + } } } @@ -198,7 +204,7 @@ void Level::begin() { camera.setSize(window_size.x, window_size.y); camera.setCenter(0, 0); camera_angle = 180.f; - + gravity_direction = GravityDirection::SOUTH; } @@ -334,7 +340,7 @@ void Level::setGravityDirection(GravityDirection set_gravity_direction) { gravity_direction = set_gravity_direction; } -std::vector& Level::getObjects() { +std::vector& Level::getObjects() { return objects; } @@ -342,6 +348,47 @@ const std::vector& Level::getObjects() const { return objects; } +std::vector& Level::getPlayers() { + return players; +} + +const std::vector& Level::getPlayers() const { + return players; +} + +void Level::addObject(Object::Ptr object) { + // si c'est un joueur, on le met dans le tableau des joueurs + // et on lui attribue un numéro + if (object->getTypeId() == Player::TYPE_ID) { + Player::Ptr player = std::dynamic_pointer_cast(object); + + player->setPlayerNumber(players.size()); + players.push_back(std::dynamic_pointer_cast(object)); + } + + objects.push_back(object); +} + +void Level::removeObject(Object::Ptr object) { + // si c'est un joueur, on le supprime de la liste des joueurs + if (object->getTypeId() == Player::TYPE_ID) { + Player::Ptr player = std::dynamic_pointer_cast(object); + players.erase(std::remove( + players.begin(), players.end(), player + ), players.end()); + + // on réattribue les numéros de joueurs + for (unsigned int i = 0; i < players.size(); i++) { + players[i]->setPlayerNumber(i); + } + } + + // on supprime l'objet de la liste d'objets + objects.erase(std::remove( + objects.begin(), objects.end(), object + ), objects.end()); +} + std::vector& Level::getZone() { return zone; } diff --git a/src/player.cpp b/src/player.cpp index 0284876..45f9944 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -21,11 +21,6 @@ Object::Ptr Player::clone() const { void Player::init(std::ifstream& file, Object::Ptr object) { Player::Ptr player = std::dynamic_pointer_cast(object); - // lecture du numéro de joueur - char player_number; - file.read(&player_number, 1); - player->setPlayerNumber(player_number); - // lecture des propriétés communes des objets Object::init(file, object); } @@ -37,10 +32,6 @@ Object::Ptr Player::load(std::ifstream& file) { } void Player::save(std::ofstream& file) const { - // écriture du numéro de joueur - char write_player_number = player_number; - file.write(&write_player_number, 1); - // écriture des propriétés communes Object::save(file); }