/* [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(); }