From fe7fa5c9a4305befa397c3e5f6206c1c1e5783b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Wed, 30 Mar 2016 14:03:52 +0200 Subject: [PATCH] Chargement de niveaux --- include/game.hpp | 27 ++++++------ levels/level1.dat | Bin 0 -> 89 bytes src/game.cpp | 107 +++++++++++++++++++++++++++++++++------------- src/main.cpp | 9 +++- 4 files changed, 101 insertions(+), 42 deletions(-) create mode 100644 levels/level1.dat diff --git a/include/game.hpp b/include/game.hpp index c6ef18a..09f3605 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -2,6 +2,8 @@ #define __PTF_GAME_HPP__ #include +#include +#include #include "view.hpp" #include "object.hpp" #include "manager.hpp" @@ -13,31 +15,37 @@ */ class Game : public View { private: - sf::View view; + std::string level_name; + std::string music_path; + std::string background_path; + + sf::Sprite sprite; sf::Music music; float accumulator; - std::vector objects; + + std::vector objects; + std::vector> level_zone; /** * Met à jour les objets du jeu pour * qu'ils s'adaptent au nouvel état */ - void update(const Manager& manager); + void update(); /** * Dessine la scène du jeu couche par couche */ - void draw(Manager& manager); + void draw(); public: - Game(); + Game(Manager& manager); virtual ~Game(); /** * Charge un niveau de jeu depuis le fichier donné */ - void load(); + void load(std::ifstream& file); /** * Sauvegarde la configuration actuelle comme un niveau @@ -53,12 +61,7 @@ public: * Demande le passage à la frame suivante sur * cette vue */ - void frame(Manager& manager); - - /** - * Ajoute un nouvel objet à la liste des objets du jeu - */ - void addObject(Object& object); + void frame(); }; #endif diff --git a/levels/level1.dat b/levels/level1.dat new file mode 100644 index 0000000000000000000000000000000000000000..05c59fd1f0b0cd4a20e585a482ba0fa493c37f9d GIT binary patch literal 89 zcmZ>A3}OgLEiO^W(=%jXVqi#cU|>*iWMG&A#0riq3~;akC;$Q=IswW~aLh?9OU*IV YD^DzANJ>o3PA|$Y%}dcM$V+Dc0INL`8~^|S literal 0 HcmV?d00001 diff --git a/src/game.cpp b/src/game.cpp index 05412fa..bd14898 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1,34 +1,87 @@ #include "game.hpp" #include "constants.hpp" #include "player.hpp" -#include +#include #include +#include +#include -Game::Game() : accumulator(0.f) { - if (!music.openFromFile("./res/music_lvl1.wav")) { - // erreur - } - - music.play(); - music.setVolume(15); - music.setLoop(true); - - load(); -} - +Game::Game(Manager& manager) : View(manager), accumulator(0.f) {} Game::~Game() { clear(); } -void Game::load() { +void Game::load(std::ifstream& file) { // vide le niveau précédent s'il y a lieu if (objects.size()) { clear(); } - // TODO: faire une vraie fonction de chargement - Player* player1 = new Player(3.5f * Constants::GRID, 10 * Constants::GRID); - objects.push_back(player1); + // lecture de la signture du fichier ("BAR") + char signature[3]; + file.read(signature, sizeof(signature)); + + if (strncmp(signature, "BAR", 3) != 0) { + throw std::runtime_error( + "Impossible de lire le fichier : en-tête invalide" + ); + } + + // lecture de la version du fichier + char file_version; + file.read(&file_version, 1); + + if (file_version != 0) { + throw std::runtime_error( + "Impossible de lire le fichier : version non prise en charge" + ); + } + + // lecture du nom du niveau + std::getline(file, level_name, '\0'); + + // lecture des positions initiales + char player_amount; + file.read(&player_amount, 1); + + for (int i = 0; i < player_amount; i++) { + float pos_x, pos_y; + + file.read((char*) &pos_x, sizeof(pos_x)); + file.read((char*) &pos_y, sizeof(pos_y)); + + pos_x *= Constants::GRID; + pos_y *= Constants::GRID; + + std::shared_ptr player = std::make_shared(pos_x, pos_y); + player->setPlayerNumber(i); + + objects.push_back(std::dynamic_pointer_cast(player)); + } + + // lecture de la zone de vie + char control_points; + file.read(&control_points, 1); + level_zone.clear(); + + for (int i = 0; i < control_points; i++) { + float pos_x, pos_y; + + file.read((char*) &pos_x, sizeof(pos_x)); + file.read((char*) &pos_y, sizeof(pos_y)); + + pos_x *= Constants::GRID; + pos_y *= Constants::GRID; + + level_zone.push_back(std::make_pair(pos_x, pos_y)); + } + + // lecture des chemins de la musique et du fond + std::getline(file, music_path, '\0'); + std::getline(file, background_path, '\0'); + + manager.getResourceManager().setMusic(music_path); + manager.getResourceManager().playMusic(); } void Game::save() { @@ -37,35 +90,31 @@ void Game::save() { } void Game::clear() { - for (unsigned int i = 0; i < objects.size(); i++) { - delete objects[i]; - } - objects.clear(); } -void Game::frame(Manager& manager) { +void Game::frame() { accumulator += manager.getElapsedTime(); // tant qu'il reste du temps à passer, // effectuer la simulation physique étape par étape while (accumulator >= Constants::PHYSICS_TIME) { accumulator -= Constants::PHYSICS_TIME; - update(manager); + update(); } - draw(manager); + draw(); } -void Game::update(const Manager& manager) { +void Game::update() { std::vector colliding; // détection des objets en collision for (unsigned int i = 0; i < objects.size(); i++) { - Object* objA = objects[i]; + ObjectPtr objA = objects[i]; for (unsigned int j = i + 1; j < objects.size(); j++) { - Object* objB = objects[j]; + ObjectPtr objB = objects[j]; CollisionData data(*objA, *objB); if (objA->detectCollision(*objB, data)) { @@ -104,12 +153,12 @@ void Game::update(const Manager& manager) { } } -void Game::draw(Manager& manager) { +void Game::draw() { // efface la scène précédente et dessine la couche de fond manager.getWindow().clear(sf::Color(66, 165, 245)); // chargement de la file d'affichage des objets - std::priority_queue, ObjectCompare> display_queue; + std::priority_queue, ObjectCompare> display_queue; for (unsigned int i = 0; i < objects.size(); i++) { display_queue.push(objects[i]); diff --git a/src/main.cpp b/src/main.cpp index 1e2492f..b59c0b3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,10 +6,17 @@ #include #include #include +#include int main() { Manager manager; - std::shared_ptr game = std::shared_ptr(new Game); + std::shared_ptr game = std::make_shared(manager); + + // ouverture du niveau + std::ifstream file; + file.open("./levels/level1.dat", std::ios::binary | std::ios::in); + game->load(file); + file.close(); manager.setView(game);