1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
#include "moteur.h"
using namespace std;
Moteur::Moteur() {
m_screen = NULL;
m_menu = NULL;
m_game = NULL;
m_frame = NULL;
m_done = false;
m_delay = DELAYMIN;
m_actualTime = m_previousTime = 0;
}
Moteur::~Moteur() {
map< string, SDL_Surface* >::iterator image;
for (image = APPImages.begin(); image != APPImages.end(); image++) {
if (image->second) SDL_FreeSurface(image->second);
}
delete m_menu;
delete m_game;
SDL_FreeSurface(m_screen);
TTF_Quit();
SDL_Quit();
}
bool Moteur::init() {
//Initialisation de la librairie SDL
if(SDL_Init(SDL_INIT_VIDEO) != 0) {
cerr << "Erreur lors de l'initialisation de la librairie SDL : " << SDL_GetError() << endl;
return false;
}
// Initialisation de la librairie SDL_ttf
if(TTF_Init() == -1) {
cerr << "Erreur lors de l'initialisation de la librairie SDL_ttf : " << TTF_GetError() << endl;
return false;
}
// Ouverture de la fenetre
m_screen = SDL_SetVideoMode(WIDTH, HEIGHT, FORMAT, SDL_DOUBLEBUF | SDL_HWSURFACE);
if(m_screen==NULL) {
cerr << "Probleme pour la fenêtre: " << SDL_GetError() << endl;
return false;
}
// Titre de la fenêtre
SDL_WM_SetCaption("Starved Version 1.0", NULL);
// APPImage : variable globale déclarée dans global.cpp
// Chargement des images
APPImages["snakebody"] = IMG_Load("../../data/images/game/redbody.png");
APPImages["wall"] = IMG_Load("../../data/images/game/wall.png");
APPImages["apple"] = IMG_Load("../../data/images/game/apple.png");
APPImages["backgroundmenu"] = IMG_Load("../../data/images/menu/background2.png");
// Verification du chargement des images
map< string, SDL_Surface* >::iterator image;
for (image = APPImages.begin(); image != APPImages.end(); image++) {
if (!image->second) {
cout << "Probleme de chargement des images du jeu." << endl;
return false;
}
}
// Initialisation des cadres
m_menu = new Menu(0, 0, m_screen->w, m_screen->h, 255, 255, 255);
m_menu->init();
m_game = new Game(0, 0, m_screen->w, m_screen->h, 255, 255, 255);
m_game->init();
// On se place dans le menu
m_frame = m_menu;
return true;
}
bool Moteur::testEvents() {
SDL_Event event;
// Si le cadre courant est le menu
if (m_frame == m_menu) SDL_WaitEvent(&event);
else SDL_PollEvent(&event);
switch(event.type) {
case SDL_QUIT :
// On quitte
quit();
return true;
case SDL_KEYDOWN :
// Test du clavier
if (event.key.keysym.sym == SDLK_ESCAPE) m_frame = m_menu;
if (m_frame == m_game) m_game->keydown(event.key.keysym.sym);
return true;
case SDL_MOUSEBUTTONDOWN :
// Test des boutons
return testButton(event.button.x, event.button.y);
case SDL_MOUSEMOTION :
// Boutons survolés
if (m_frame->mousemotion(event.motion.x, event.motion.y)) return true;
return false;
default :
return true;
}
return true;
}
bool Moteur::testButton(int cx, int cy) {
string button;
// Quel bouton a été cliqué
m_frame->mousedown(cx, cy, button);
// On quitte
if (button == "Quitter") {
quit();
return true;
}
// On charge une nouvelle partie
if (button == "Nouveau") {
cout << "ok" << endl;
m_game->loadLevel();
m_frame = m_game;
return true;
}
return false;
}
void Moteur::display() {
// Affichage du menu si on se trouve dedans
if (m_frame == m_menu) m_menu->display(m_screen);
// Affichage du jeu si on se trouve dedans
else if (m_frame == m_game) m_game->display(m_screen);
}
void Moteur::update() {
// Mise à jour du jeu
if (m_frame == m_game) m_game->update();
}
void Moteur::mainloop() {
m_done = false;
bool change;
// Boucle principale
while(!m_done) {
// Traitement des evenements
// change : si une action à changé l'apparence du cadre courrant
change = testEvents();
// Gestion du temps
m_actualTime = SDL_GetTicks();
if (m_actualTime - m_previousTime > m_delay) m_previousTime = m_actualTime;
else SDL_Delay(m_delay - (m_actualTime - m_previousTime));
// Mise à jour du jeu
update();
// Affichage
if (change) {
display();
SDL_Flip(m_screen);
}
}
}
void Moteur::quit() {
// Fin de la boucle principale
m_done = true;
} |
Partager