lab.cpp/SDL#2/SDL#1/sdltl.cpp

134 lines
3.1 KiB
C++

/* [CONSTRUCTOR] Constructeur de la classe
=========================================================*/
sdltl::sdltl(const char *t, int w, int h){
// default values
_lasttick = 0;
_fpstime = 1000/60;
SDL_Init( SDL_INIT_EVERYTHING );
_window = NULL;
_screen = NULL;
// Creation de la fenetre
_window = SDL_CreateWindow(
t,
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
w,
h,
SDL_WINDOW_SHOWN
);
// Gestion erreur
if( _window == NULL )
_status = false;
// On recupere la surface
_screen = SDL_GetWindowSurface( _window );
// On retourne que tout s'est bien passe
_status = true;
}
/* [DESTROYER] Destructeur de la classe
=========================================================*/
sdltl::~sdltl(){
SDL_DestroyWindow( _window );
SDL_Quit();
}
/* [STATUS] Retourne le status
=========================================================*/
bool sdltl::status(){
return _window != NULL && _screen != NULL;
}
/* [WINDOW] Retourne la fenetre
=========================================================*/
SDL_Window* sdltl::window(){ return _window; }
/* [SCREEN] Retourne la fenetre
=========================================================*/
SDL_Surface* sdltl::screen(){ return _screen; }
/* [SETBACKGROUND] Modifie la couleur de fond
=========================================================*/
void sdltl::setBackground(int r, int g, int b){
Uint32 color = SDL_MapRGB( _screen->format, r, g, b );
SDL_FillRect( _screen, NULL, color );
}
/* [SETIMAGE] Met une image en fond
=========================================================*/
bool sdltl::setImage(const char *url){
SDL_Surface *image = NULL;
image = SDL_LoadBMP( url );
// Si erreur de chargement image
if( image == NULL )
return false;
SDL_Rect dimensions;
dimensions.x = 0;
dimensions.y = 0;
SDL_GetWindowSize(_window, &dimensions.w, &dimensions.h);
SDL_BlitSurface( image, NULL, _screen, &dimensions);
// On libere la surface pour l'image
SDL_FreeSurface(image);
image = NULL;
return true;
}
/* [UPDATE] Mise a jour du rendu
=========================================================*/
void sdltl::update(){
SDL_UpdateWindowSurface( _window );
}
/* [WAITEVENT] Attends un evenement pour executer
=========================================================*/
void sdltl::waitEvent(SDL_EventType t, void(*handler)(SDL_Event*)){
SDL_Event event;
// On attends un evenement
while( SDL_PollEvent(&event) ){
// quand evenement, si type = t
if( event.type == t )
(*handler)(&event);
}
}
/* [MANAGEFTP] Gestion de la vitesse de boucle
=========================================================*/
void sdltl::manageFps(const int fps){
/* (1) Definition de fps */
if( fps != 0 ) _fpstime = 1000/fps;
/* (2) Initialisation timer */
if( _lasttick == 0 )
_lasttick = SDL_GetTicks();
/* (3) Utilisation en fin de WHILE() */
// 1 > Si trop rapide, on attends + definit _lasttick
else if( SDL_GetTicks()-_lasttick < _fpstime ){
SDL_Delay( _fpstime - (SDL_GetTicks()-_lasttick) );
_lasttick = SDL_GetTicks() + _fpstime - (SDL_GetTicks()-_lasttick);
// 2 > Temps ok
}else
_lasttick = SDL_GetTicks();
}