lab.cpp/SDL#4/main.cpp

249 lines
4.4 KiB
C++
Raw Normal View History

2016-03-12 23:22:28 +00:00
#include "main.h"
// On cree un sdl-toplevel statique
static xManager *mgr = NULL;
static xMarioMario *mario = NULL;
2016-03-12 23:22:28 +00:00
2016-03-13 19:36:16 +00:00
static bool left_move = false;
static bool right_move = false;
static bool up_move = false;
static bool down_move = false;
2016-03-12 23:22:28 +00:00
int main(int argc, char* argv[]) {
srand(time(0));
/* [0] Initialisation du manager + Creation de la fenetre
=========================================================*/
mgr = new xManager("Ma fenetre SDL", BLOC_WIDTH*BLOC_SIZE, BLOC_HEIGHT*BLOC_SIZE);
2016-03-12 23:22:28 +00:00
// Gestion erreur
if( !mgr->status() ){
cout << "[INIT] -> " << SDL_GetError() << endl;
return -1;
}
// Couleur de fond
mgr->setBackground(0, 96, 183);
mgr->setImage("src/bg1.png");
2016-03-12 23:22:28 +00:00
/* [2] On definit le terrain
2016-03-12 23:22:28 +00:00
=========================================================*/
// On cree un bout du terrain
xMarioGrass g1(mgr, (SDL_Rect){-1, 20-4, 32+2, 5} );
g1.push("grass1");
2016-03-12 23:22:28 +00:00
2016-03-13 19:36:16 +00:00
// On cree un bout du terrain
xMarioBloc b1(mgr, (SDL_Rect){10, 20-6, 14, 1});
b1.push("bloc1");
xMarioBloc b2(mgr, (SDL_Rect){23, 20-7, 1, 1});
b2.push("bloc2");
2016-03-13 19:36:16 +00:00
2016-03-12 23:22:28 +00:00
2016-03-13 14:22:14 +00:00
/* [3] Gestion des blocs
=========================================================*/
// On cree une coquille verte
xMarioGreenShell gs(mgr, 20-8, 20-9);
gs.push("green-sheel");
gs.start(80, SPRITE_ANIM_INFINITE);
2016-03-12 23:22:28 +00:00
// On cree une brique
xMarioBrick mBrick(mgr, 3, 20-7, 10); // 10 sauts
mBrick.push("brick");
xMarioBrick mBrick2(mgr, 10, 20-7, 5); // 5 sauts
mBrick2.push("brick2");
// On cree un bloc mystere
xMarioMysteryBloc mMystery(mgr, 5, 20-7, 2); // 2 sauts
mMystery.push("mystery-bloc");
mMystery.start(150, SPRITE_ANIM_INFINITE);
// On cree mario
mario = new xMarioMario(mgr, 17, 20-7);
mario->push("mario");
mario->start(100, SPRITE_ANIM_INFINITE);
2016-03-12 23:22:28 +00:00
2016-03-16 13:36:46 +00:00
/* [n-2] Boucle infinie
2016-03-12 23:22:28 +00:00
=========================================================*/
// Gestion des evenements
SDL_Event event;
mgr->attachEvent(SDL_KEYDOWN, &keydownEventHandler); // Evenement appui clavier
mgr->attachEvent(SDL_KEYUP, &keyupEventHandler); // Evenement relache clavier
mgr->attachEvent(SDL_QUIT, &quitEventHandler); // Evenement QUITTER
mgr->debug();
2016-03-15 22:54:12 +00:00
// Boucle de traitement
mgr->update();
2016-03-12 23:22:28 +00:00
mgr->manageFps(FPS);
2016-03-16 13:36:46 +00:00
mgr->state = 0;
while(mgr->state==0){
2016-03-12 23:22:28 +00:00
// Gestion des evenements
while( SDL_PollEvent(&event) != 0 )
mgr->manageEvents(&event);
2016-03-12 23:22:28 +00:00
// Deplacement de Mario
2016-03-14 12:14:35 +00:00
mario->moveFromVelocity();
// Deplacement coquille verte
gs.autoMove();
// Mise a jour du rendu
mgr->manageFps(); // Gestion des FPS (speed)
mgr->update(); // Mise a jour du rendu
2016-03-12 23:22:28 +00:00
}
2016-03-16 13:36:46 +00:00
/* [n-1] Gestion de l'arret
=========================================================*/
if( mgr->state == 2 ){
mgr->clearAll(); // On vire tout
mgr->setBackground(0, 0, 0); // Fond noir
mgr->setImage("src/game_over.jpg"); // Image GAME OVER
mgr->update(); // Mise a jour du rendu
usleep(100*1000); // Attente 3 sec
2016-03-16 13:36:46 +00:00
}
2016-03-12 23:22:28 +00:00
/* [n] Fin d'execution
=========================================================*/
delete mgr;
return 0;
}
2016-03-13 19:36:16 +00:00
/* GESTION DE QUAND ON QUITTE LA FENETRE
*
* @e<SDL_Event*> Pointeur sur l'evenement appelant
*
*/
2016-03-12 23:22:28 +00:00
void quitEventHandler(SDL_Event *e){
cout << "Exiting program" << endl;
2016-03-16 13:36:46 +00:00
mgr->state = 1;
}
2016-03-13 19:36:16 +00:00
/* GESTION DE QUAND ON APPUIE SUR FLECHE BAS
*
* @e<SDL_Event*> Pointeur sur l'evenement appelant
*
*/
void keydownEventHandler(SDL_Event *e){
switch( (*e).key.keysym.sym ){
case SDLK_UP:
2016-03-14 12:14:35 +00:00
if( !mario->_up ){
mario->_up = true;
// mario->velocity(0, -40.0);
}
2016-03-13 19:36:16 +00:00
break;
2016-03-13 19:36:16 +00:00
case SDLK_LEFT:
2016-03-14 12:14:35 +00:00
if( !mario->_left ){
mario->_left = true;
// mario->velocity(-15.0, 0);
}
2016-03-13 19:36:16 +00:00
break;
2016-03-13 19:36:16 +00:00
case SDLK_RIGHT:
2016-03-14 12:14:35 +00:00
if( !mario->_right ){
mario->_right = true;
// mario->velocity(15.0, 0);
}
2016-03-13 19:36:16 +00:00
break;
2016-03-13 19:36:16 +00:00
case SDLK_DOWN:
2016-03-14 12:14:35 +00:00
if( !mario->_down ){
// mario->_down = true;
2016-03-14 12:14:35 +00:00
// mario->velocity(0, 1.0);
}
2016-03-13 19:36:16 +00:00
break;
default:
cout << "UNUSED KEY" << endl;
break;
2016-03-13 19:36:16 +00:00
}
}
2016-03-13 19:36:16 +00:00
/* GESTION DE QUAND ON APPUIE SUR FLECHE BAS
*
* @e<SDL_Event*> Pointeur sur l'evenement appelant
*
*/
void keyupEventHandler(SDL_Event *e){
switch( (*e).key.keysym.sym ){
case SDLK_UP:
2016-03-14 12:14:35 +00:00
mario->_up = false;
2016-03-13 19:36:16 +00:00
break;
case SDLK_LEFT:
2016-03-14 12:14:35 +00:00
mario->_left = false;
break;
case SDLK_RIGHT:
2016-03-14 12:14:35 +00:00
mario->_right = false;
break;
case SDLK_DOWN:
// mario->_down = false;
break;
default:
cout << "PRESSED" << endl;
break;
}
2016-03-12 23:22:28 +00:00
}