Meilleure encapsulation du manager et passage de level

This commit is contained in:
Mattéo Delabre 2016-04-09 04:36:30 +02:00
parent 6ae0b14adf
commit bf66ba4dbb
13 changed files with 130 additions and 72 deletions

View File

@ -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

View File

@ -108,15 +108,25 @@ public:
*/
std::vector<ObjectPtr>& getObjects();
/**
* Récupère la liste des objets (version constante)
*/
const std::vector<ObjectPtr>& getObjects() const;
/**
* Récupère la zone du niveau
*/
std::vector<std::pair<float, float>>& getZone();
/**
* Récupère la zone du niveau (version constante)
*/
const std::vector<std::pair<float, float>>& getZone() const;
/**
* Récupère la caméra actuelle
*/
sf::View getCamera();
sf::View getCamera() const;
/**
* Modifie la caméra

View File

@ -10,6 +10,8 @@
typedef std::shared_ptr<Object> 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<ObjectPtr>& 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<ObjectPtr>& 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

View File

@ -13,7 +13,7 @@ protected:
/**
* Calcule les forces appliquées au joueur
*/
virtual sf::Vector2f getForces(const Manager& manager, const std::vector<ObjectPtr>& 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

View File

@ -3,6 +3,7 @@
#include <SFML/Graphics.hpp>
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<sf::Event>& 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

View File

@ -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"));

View File

@ -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<SelectorCategory> 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<sf::Event>& events) {
@ -35,7 +35,7 @@ void Editor::frame(const std::vector<sf::Event>& 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> game = std::shared_ptr<Game>(new Game(manager));
std::shared_ptr<Game> game = std::shared_ptr<Game>(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);
}

View File

@ -14,7 +14,7 @@ Game::~Game() {}
void Game::begin() {
Level::begin();
manager.getWindow().setFramerateLimit(0);
getWindow().setFramerateLimit(0);
}
void Game::frame(const std::vector<sf::Event>& events) {
@ -22,9 +22,8 @@ void Game::frame(const std::vector<sf::Event>& 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

View File

@ -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<ObjectPtr>& Level::getObjects() {
return objects;
}
const std::vector<ObjectPtr>& Level::getObjects() const {
return objects;
}
std::vector<std::pair<float, float>>& Level::getZone() {
return zone;
}
sf::View Level::getCamera() {
const std::vector<std::pair<float, float>>& 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);

View File

@ -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<sf::Event>& events) {
@ -23,14 +23,14 @@ void Menu::frame(const std::vector<sf::Event>& 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<View> editor = std::shared_ptr<View>(new Editor(manager));
manager.setView(editor);
std::shared_ptr<View> editor = std::shared_ptr<View>(new Editor(getManager()));
getManager().setView(editor);
}
void Menu::launchGame(std::string name) {
std::shared_ptr<Game> game = std::shared_ptr<Game>(new Game(manager));
std::shared_ptr<Game> game = std::shared_ptr<Game>(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();
}

View File

@ -1,4 +1,5 @@
#include "object.hpp"
#include "level.hpp"
#include "constants.hpp"
#include "collision.hpp"
#include <cmath>
@ -85,10 +86,9 @@ void Object::load(std::ifstream& file, ObjectPtr object) {
}
}
sf::Vector2f Object::getForces(
const Manager& manager, const std::vector<ObjectPtr>& objects
) const {
sf::Vector2f Object::getForces(const Level& level) const {
sf::Vector2f forces(0, 0);
const std::vector<ObjectPtr>& 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<ObjectPtr>& 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 {

View File

@ -1,4 +1,5 @@
#include "player.hpp"
#include "level.hpp"
#include "block.hpp"
#include "constants.hpp"
#include <array>
@ -35,26 +36,26 @@ ObjectPtr Player::load(std::ifstream& file) {
return object;
}
sf::Vector2f Player::getForces(const Manager& manager, const std::vector<ObjectPtr>& 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<ObjectP
return forces;
}
void Player::draw(Manager& manager) {
void Player::draw(Level& level) {
// utilisation de la texture
sprite.setTexture(
&manager.getResourceManager().getTexture("player.tga")
&level.getResourceManager().getTexture("player.tga")
);
// si le joueur est sélectionné, on met sa bordure en rouge
@ -82,7 +83,7 @@ void Player::draw(Manager& manager) {
// déplacement du sprite à la position de la balle
sprite.setPosition(getPosition());
manager.getWindow().draw(sprite);
level.getWindow().draw(sprite);
}
void Player::activated(Object& object) {
@ -91,11 +92,11 @@ void Player::activated(Object& object) {
// qui s'occupe de la réponse
}
void Player::updatePosition(float delta){
void Player::updatePosition() {
// calcul de la différence de position pour connaître
// (approximativement) la rotation de la balle
sf::Vector2f last_position = getPosition();
Object::updatePosition(delta);
Object::updatePosition();
sprite.rotate((getPosition() - last_position).x * 3.f);
}

View File

@ -1,4 +1,5 @@
#include "view.hpp"
#include "manager.hpp"
View::View(Manager& manager) : manager(manager) {}
View::~View() {}
@ -9,3 +10,20 @@ void View::frame(const std::vector<sf::Event>& 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);
}