Meilleure gestion des changements de vue & quitter
This commit is contained in:
parent
266c0529d9
commit
14086f1e05
|
@ -72,20 +72,18 @@ protected:
|
||||||
virtual void draw();
|
virtual void draw();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Traite un événement et renvoie true si le
|
* Traite un événement
|
||||||
* dessin de la frame doit être interrompu
|
|
||||||
*/
|
*/
|
||||||
virtual bool processEvent(const sf::Event& event);
|
virtual void processEvent(const sf::Event& event);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Editor(Manager& manager);
|
Editor(Manager& manager);
|
||||||
virtual ~Editor();
|
virtual ~Editor();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Demande le passage à la frame suivante sur cette vue,
|
* Demande le passage à la frame suivante sur cette vue
|
||||||
* renvoie true si le rendu de la frame a été interrompu
|
|
||||||
*/
|
*/
|
||||||
virtual bool frame();
|
virtual void frame();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Charge un niveau de jeu depuis le fichier donné
|
* Charge un niveau de jeu depuis le fichier donné
|
||||||
|
|
|
@ -29,10 +29,9 @@ protected:
|
||||||
virtual void draw();
|
virtual void draw();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Traite un événement et renvoie true si le
|
* Traite un événement
|
||||||
* dessin de la frame doit être interrompu
|
|
||||||
*/
|
*/
|
||||||
virtual bool processEvent(const sf::Event& event);
|
virtual void processEvent(const sf::Event& event);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Game(Manager& manager);
|
Game(Manager& manager);
|
||||||
|
@ -44,10 +43,9 @@ public:
|
||||||
virtual void load(std::ifstream& file);
|
virtual void load(std::ifstream& file);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Demande le passage à la frame suivante sur cette vue,
|
* Demande le passage à la frame suivante sur cette vue
|
||||||
* renvoie true si le rendu de la frame a été interrompu
|
|
||||||
*/
|
*/
|
||||||
virtual bool frame();
|
virtual void frame();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mise en mode test : l'appui sur espace renvoie
|
* Mise en mode test : l'appui sur espace renvoie
|
||||||
|
|
|
@ -30,10 +30,9 @@ protected:
|
||||||
virtual void draw();
|
virtual void draw();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Traite un événement et renvoie true si le
|
* Traite un événement
|
||||||
* dessin de la frame doit être interrompu
|
|
||||||
*/
|
*/
|
||||||
virtual bool processEvent(const sf::Event& event);
|
virtual void processEvent(const sf::Event& event);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convertit les coordonnées à l'écran en coordonnées du monde
|
* Convertit les coordonnées à l'écran en coordonnées du monde
|
||||||
|
@ -56,10 +55,9 @@ public:
|
||||||
virtual void save();
|
virtual void save();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Demande le passage à la frame suivante sur
|
* Demande le passage à la frame suivante sur cette vue
|
||||||
* cette vue
|
|
||||||
*/
|
*/
|
||||||
virtual bool frame();
|
virtual void frame();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupère le nom du niveau
|
* Récupère le nom du niveau
|
||||||
|
|
|
@ -13,14 +13,16 @@ class Manager {
|
||||||
private:
|
private:
|
||||||
sf::RenderWindow window;
|
sf::RenderWindow window;
|
||||||
sf::Clock clock;
|
sf::Clock clock;
|
||||||
sf::View window_view;
|
|
||||||
sf::String title;
|
|
||||||
sf::View default_view;
|
sf::View default_view;
|
||||||
|
sf::String title;
|
||||||
|
|
||||||
ResourceManager resource_manager;
|
ResourceManager resource_manager;
|
||||||
std::vector<sf::Event> events;
|
std::vector<sf::Event> events;
|
||||||
|
|
||||||
std::shared_ptr<View> view;
|
std::shared_ptr<View> view;
|
||||||
|
std::shared_ptr<View> next_view;
|
||||||
|
|
||||||
|
bool running;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Manager();
|
Manager();
|
||||||
|
@ -30,6 +32,11 @@ public:
|
||||||
*/
|
*/
|
||||||
void start();
|
void start();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Termine la boucle principale et quitte le jeu
|
||||||
|
*/
|
||||||
|
void quit();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renvoie la vue actuelle du jeu
|
* Renvoie la vue actuelle du jeu
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -26,7 +26,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Dessine le menu
|
* Dessine le menu
|
||||||
*/
|
*/
|
||||||
bool frame();
|
void frame();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de changer le choix sélectionné
|
* Permet de changer le choix sélectionné
|
||||||
|
|
|
@ -18,10 +18,9 @@ public:
|
||||||
virtual ~View();
|
virtual ~View();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Demande le passage à la frame suivante sur cette vue,
|
* Demande le passage à la frame suivante sur cette vue
|
||||||
* renvoie true si le rendu de la frame a été interrompu
|
|
||||||
*/
|
*/
|
||||||
virtual bool frame() = 0;
|
virtual void frame() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,28 +21,21 @@ void Editor::load(std::ifstream& file) {
|
||||||
manager.setTitle(sf::String(L"Édition de ") + getName());
|
manager.setTitle(sf::String(L"Édition de ") + getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Editor::frame() {
|
void Editor::frame() {
|
||||||
// si le dessin de la frame a été interrompu par
|
// traitements généraux
|
||||||
// le traitement événementiel, on arrête
|
Level::frame();
|
||||||
if (Level::frame()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// dessin de la frame
|
// dessin de la frame
|
||||||
draw();
|
draw();
|
||||||
sf::sleep(sf::seconds(1.f / 30));
|
sf::sleep(sf::seconds(1.f / 30));
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Editor::processEvent(const sf::Event& event) {
|
void Editor::processEvent(const sf::Event& event) {
|
||||||
if (Level::processEvent(event)) {
|
Level::processEvent(event);
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// traitement des événements du widget timer
|
// traitement des événements du widget timer
|
||||||
if (widget_timer.processEvent(event)) {
|
if (widget_timer.processEvent(event)) {
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// lorsque l'on clique dans l'éditeur
|
// lorsque l'on clique dans l'éditeur
|
||||||
|
@ -151,14 +144,8 @@ bool Editor::processEvent(const sf::Event& event) {
|
||||||
// appui sur espace : test du niveau en cours d'édition
|
// appui sur espace : test du niveau en cours d'édition
|
||||||
if (event.key.code == sf::Keyboard::Space) {
|
if (event.key.code == sf::Keyboard::Space) {
|
||||||
test();
|
test();
|
||||||
|
|
||||||
// demande l'interruption du dessin de la
|
|
||||||
// frame car l'objet risque d'être détruit
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::draw() {
|
void Editor::draw() {
|
||||||
|
|
30
src/game.cpp
30
src/game.cpp
|
@ -13,12 +13,9 @@ void Game::load(std::ifstream& file) {
|
||||||
manager.setTitle(getName());
|
manager.setTitle(getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Game::frame() {
|
void Game::frame() {
|
||||||
// si le dessin de la frame a été interrompu par
|
// traitements généraux
|
||||||
// le traitement événementiel, on arrête
|
Level::frame();
|
||||||
if (Level::frame()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
sf::Time current_time = manager.getCurrentTime();
|
sf::Time current_time = manager.getCurrentTime();
|
||||||
|
|
||||||
|
@ -39,32 +36,27 @@ bool Game::frame() {
|
||||||
// le temps nécessaire pour revenir dans les temps
|
// le temps nécessaire pour revenir dans les temps
|
||||||
sf::sleep(next_frame_time - current_time);
|
sf::sleep(next_frame_time - current_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Game::processEvent(const sf::Event& event) {
|
void Game::processEvent(const sf::Event& event) {
|
||||||
|
Level::processEvent(event);
|
||||||
|
|
||||||
// appui sur espace en mode test : retour à l'éditeur
|
// appui sur espace en mode test : retour à l'éditeur
|
||||||
if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space && test_mode) {
|
if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space && test_mode) {
|
||||||
test_mode = false;
|
test_mode = false;
|
||||||
manager.setView(return_view);
|
manager.setView(return_view);
|
||||||
|
|
||||||
// demande l'interruption du dessin de la
|
|
||||||
// frame car l'objet risque d'être détruit
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::draw() {
|
void Game::draw() {
|
||||||
|
sf::Vector2i window_size = (sf::Vector2i) manager.getWindow().getSize();
|
||||||
|
|
||||||
|
// dessin des objets du niveau
|
||||||
Level::draw();
|
Level::draw();
|
||||||
|
|
||||||
sf::View window_view = manager.getWindowView();
|
// dessin du timer
|
||||||
|
|
||||||
// dessin du widget
|
|
||||||
widget_timer.setTimeLeft(getTotalTime());
|
widget_timer.setTimeLeft(getTotalTime());
|
||||||
widget_timer.draw(sf::Vector2f(window_view.getSize().x / 2 - 50, 0));
|
widget_timer.draw(sf::Vector2f(window_size.x / 2 - 50, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::update() {
|
void Game::update() {
|
||||||
|
|
|
@ -118,31 +118,21 @@ void Level::save() {
|
||||||
// TODO: faire une fonction d'enregistrement
|
// TODO: faire une fonction d'enregistrement
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Level::frame() {
|
void Level::frame() {
|
||||||
const std::vector<sf::Event>& events = manager.getEvents();
|
const std::vector<sf::Event>& events = manager.getEvents();
|
||||||
|
|
||||||
// traitement des événements
|
// traitement des événements
|
||||||
for (unsigned int i = 0; i < events.size(); i++) {
|
for (unsigned int i = 0; i < events.size(); i++) {
|
||||||
if (processEvent(events[i])) {
|
processEvent(events[i]);
|
||||||
// /!\ On arrête là si on a demandé l'interruption.
|
|
||||||
// Il est important de ne plus appeler aucune autre
|
|
||||||
// fonction de la classe pour éviter une erreur
|
|
||||||
// de segmentation
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Level::processEvent(const sf::Event& event) {
|
void Level::processEvent(const sf::Event& event) {
|
||||||
// lorsque la fenêtre est redimensionnée, mise à jour
|
// lorsque la fenêtre est redimensionnée, mise à jour
|
||||||
// de la taille de la caméra
|
// de la taille de la caméra
|
||||||
if (event.type == sf::Event::Resized) {
|
if (event.type == sf::Event::Resized) {
|
||||||
camera.setSize(event.size.width, event.size.height);
|
camera.setSize(event.size.width, event.size.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Level::draw() {
|
void Level::draw() {
|
||||||
|
|
|
@ -3,21 +3,30 @@
|
||||||
Manager::Manager() : window(
|
Manager::Manager() : window(
|
||||||
sf::VideoMode(704, 480), "Skizzle", sf::Style::Default,
|
sf::VideoMode(704, 480), "Skizzle", sf::Style::Default,
|
||||||
sf::ContextSettings(0, 0, 2)
|
sf::ContextSettings(0, 0, 2)
|
||||||
), window_view(window.getView()), title(sf::String(L"")), view(NULL) {}
|
), default_view(window.getDefaultView()), title(sf::String(L"")),
|
||||||
|
view(NULL), next_view(NULL), running(false) {}
|
||||||
|
|
||||||
void Manager::start() {
|
void Manager::start() {
|
||||||
while (window.isOpen()) {
|
running = true;
|
||||||
|
|
||||||
|
while (running) {
|
||||||
sf::Event event;
|
sf::Event event;
|
||||||
events.clear();
|
events.clear();
|
||||||
|
|
||||||
|
// si un changement de vue a été demandé, on l'effectue maintenant
|
||||||
|
if (next_view != nullptr) {
|
||||||
|
view = next_view;
|
||||||
|
next_view = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
// traitement des évènements reçus
|
// traitement des évènements reçus
|
||||||
while (window.pollEvent(event)) {
|
while (window.pollEvent(event)) {
|
||||||
// fermeture de la fenêtre
|
// fermeture de la fenêtre
|
||||||
if (event.type == sf::Event::Closed) {
|
if (event.type == sf::Event::Closed) {
|
||||||
window.close();
|
quit();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// redimensionnement de la fenêtre
|
||||||
if (event.type == sf::Event::Resized) {
|
if (event.type == sf::Event::Resized) {
|
||||||
default_view = sf::View(sf::FloatRect(
|
default_view = sf::View(sf::FloatRect(
|
||||||
0, 0, event.size.width, event.size.height
|
0, 0, event.size.width, event.size.height
|
||||||
|
@ -38,12 +47,18 @@ void Manager::start() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Manager::quit() {
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<View> Manager::getView() {
|
std::shared_ptr<View> Manager::getView() {
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Manager::setView(std::shared_ptr<View> set_view) {
|
void Manager::setView(std::shared_ptr<View> set_view) {
|
||||||
view = set_view;
|
// on ne change pas immédiatement la vue, on attend
|
||||||
|
// la prochaine frame pour éviter toute erreur de segmentation
|
||||||
|
next_view = set_view;
|
||||||
}
|
}
|
||||||
|
|
||||||
sf::RenderWindow& Manager::getWindow() {
|
sf::RenderWindow& Manager::getWindow() {
|
||||||
|
|
24
src/menu.cpp
24
src/menu.cpp
|
@ -68,7 +68,7 @@ void Menu::MoveDown()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Menu::frame(){
|
void Menu::frame(){
|
||||||
sf::RenderWindow& window = manager.getWindow();
|
sf::RenderWindow& window = manager.getWindow();
|
||||||
window.clear(sf::Color(66, 40, 245));
|
window.clear(sf::Color(66, 40, 245));
|
||||||
|
|
||||||
|
@ -108,19 +108,11 @@ bool Menu::frame(){
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
manager.setView(game);
|
manager.setView(game);
|
||||||
|
|
||||||
// demande l'interruption du dessin de la
|
|
||||||
// frame car l'objet risque d'être détruit
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//si on choisit "Quitter", la fenêtre se ferme
|
//si on choisit "Quitter", la fenêtre se ferme
|
||||||
if(selection == 3){
|
if(selection == 3){
|
||||||
manager.getWindow().close();
|
manager.quit();
|
||||||
|
|
||||||
// demande l'interruption du dessin de la
|
|
||||||
// frame car l'objet risque d'être détruit
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(menu_nb == 1){
|
if(menu_nb == 1){
|
||||||
|
@ -137,19 +129,11 @@ bool Menu::frame(){
|
||||||
if(selection==2){
|
if(selection==2){
|
||||||
std::shared_ptr<View> editor = std::shared_ptr<View>(new Editor(manager));
|
std::shared_ptr<View> editor = std::shared_ptr<View>(new Editor(manager));
|
||||||
manager.setView(editor);
|
manager.setView(editor);
|
||||||
|
|
||||||
// demande l'interruption du dessin de la
|
|
||||||
// frame car l'objet risque d'être détruit
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//si on choisit "quitter", la fenêtre se ferme
|
//si on choisit "quitter", la fenêtre se ferme
|
||||||
if(selection==3){
|
if(selection==3){
|
||||||
manager.getWindow().close();
|
manager.quit();
|
||||||
|
|
||||||
// demande l'interruption du dessin de la
|
|
||||||
// frame car l'objet risque d'être détruit
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,6 +146,6 @@ bool Menu::frame(){
|
||||||
{
|
{
|
||||||
window.draw(choice[i]);
|
window.draw(choice[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
window.display();
|
window.display();
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue