lab.cpp/SDL#3/sdltl.cpp

197 lines
4.5 KiB
C++

/* [CONSTRUCTOR] Constructeur de la classe
=========================================================*/
sdltl::sdltl(const char *t, int w, int h){
// default values
_lasttick = 0;
_fpstime = 1000/60;
_window = NULL;
_renderer = NULL;
_texture = NULL;
// Initialisation des sous-sys. SDL
SDL_Init( SDL_INIT_EVERYTHING );
// Creation de la fenetre
_window = SDL_CreateWindow(
t,
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
w,
h,
SDL_WINDOW_SHOWN
);
// Gestion erreur
if( _window == NULL )
return;
// Creation du renderer
_renderer = SDL_CreateRenderer(
_window,
-1,
SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC
);
}
/* [DESTROYER] Destructeur de la classe
=========================================================*/
sdltl::~sdltl(){
SDL_DestroyTexture(_texture);
SDL_DestroyRenderer(_renderer);
SDL_DestroyWindow( _window );
SDL_Quit();
}
/* [STATUS] Retourne le status
=========================================================*/
bool sdltl::status(){
return _window != NULL && _renderer != NULL;
}
/* [WINDOW] Retourne la fenetre
=========================================================*/
SDL_Window* sdltl::window(){ return _window; }
/* [SCREEN] Retourne la fenetre
=========================================================*/
SDL_Renderer* sdltl::renderer(){ return _renderer; }
/* [SETBACKGROUND] Modifie la couleur de fond
=========================================================*/
bool sdltl::setBackground(Uint8 r, Uint8 g, Uint8 b, Uint8 a){
SDL_SetRenderDrawColor( _renderer, r, g, b, a );
return true;
}
/* [SETIMAGE] Met une image en fond
=========================================================*/
bool sdltl::setImage(const char *url){
// On cree la texture associee
_texture = IMG_LoadTexture( _renderer, url );
return _texture != NULL;
}
/* [PUSH] Ajoute une texture au rendu principal
=========================================================*/
void sdltl::push(SDL_Texture *t, SDL_Rect *src, SDL_Rect *dst){
// On bloque l'acces inter-thread
_mutex.lock();
_sprites.push_back( t );
_src.push_back( src );
_dst.push_back( dst );
// On debloque l'acces
_mutex.unlock();
}
/* [PULL] Retire une texture du rendu principal
=========================================================*/
void sdltl::pull(SDL_Texture *t){
// On bloque l'acces inter-thread
_mutex.lock();
// On cherche l'indice de la texture
int index = -1;
for( int i = 0 ; i < _sprites.size() ; i++ )
if( _sprites[i] == t ) index = i;
// Si on a rien trouve
if( index == -1 )
return;
// On supprime la texture et ses dimensions
_sprites.erase( _sprites.begin() + index );
_src.erase( _src.begin() + index );
_dst.erase( _dst.begin() + index );
// On debloque l'acces
_mutex.unlock();
}
/* [UPDATE] Mise a jour du rendu
=========================================================*/
void sdltl::update(){
// cout << "Update MAIN SPRITE +" << _sprites.size() << " added sprites.." << endl;
/* (1) On efface le rendu */
SDL_RenderClear(_renderer);
/* (2) On applique la couleur de fond */
SDL_Rect dRect; // On recupere les dimensions de la fenetre
SDL_GetWindowSize(_window, &dRect.w, &dRect.h);
SDL_RenderDrawRect(_renderer, &dRect);
/* (3) On ajoute le rendu principal (si existe) */
if( _texture != NULL)
SDL_RenderCopy(_renderer, _texture, NULL, NULL);
/* (4) On ajoute toutes les textures pushees */
for( int i = 0 ; i < _sprites.size() ; i++ )
SDL_RenderCopy(_renderer, _sprites[i], _src[i], _dst[i]);
/* (n) On affiche le resultat */
SDL_RenderPresent(_renderer);
}
/* [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();
}