diff --git a/SDL#4/exe b/SDL#4/exe index d2ad4ba..0925e3c 100755 Binary files a/SDL#4/exe and b/SDL#4/exe differ diff --git a/SDL#4/main.o b/SDL#4/main.o index e91f3ed..2e9fdaf 100644 Binary files a/SDL#4/main.o and b/SDL#4/main.o differ diff --git a/SDL#4/todo.md b/SDL#4/todo.md index 72f13ef..dc51034 100644 --- a/SDL#4/todo.md +++ b/SDL#4/todo.md @@ -9,6 +9,7 @@ A FAIRE EN COURS ======== +- [ ] Optimisation/Correction des collisions - [ ] Liberation memoire car lag - [ ] Gestion sprites de mario en fonction mouvement - [...] Gestion velocite pour deplacement diff --git a/SDL#4/xSDL/xManager.cpp b/SDL#4/xSDL/xManager.cpp index 56f26f2..9a4199d 100644 --- a/SDL#4/xSDL/xManager.cpp +++ b/SDL#4/xSDL/xManager.cpp @@ -29,6 +29,7 @@ xManager::xManager(const char *t, int w, int h){ // On enregistre les dimensions de la fenetre _winrect.x = _winrect.y = 0; + _winrect.w = w; _winrect.h = h; SDL_GetWindowSize(_window, &_winrect.w, &_winrect.h); // Creation du renderer @@ -86,70 +87,8 @@ bool xManager::setImage(const char *url){ } -/* [HIT] Retourne si une texture est en collision avec une autre -=========================================================*/ -bool xManager::hit(string current, int movex, int movey){ - // Anti conflit inter-thread - _mutex_hit.lock(); - - /* (1) On recupere le SDL_Rect destination du sprite courant */ - SDL_Rect *cRect = this->getDst(current); - - // Gestion erreur - if( cRect == NULL ){ - _mutex_hit.unlock(); - return false; - } - - SDL_Rect r = (SDL_Rect){ - (*cRect).x+movex, - (*cRect).y+movey, - (*cRect).w, - (*cRect).h - }; - SDL_Rect c; - - /* (2) On regarde si en dehors de la fenetre */ - for( int y = r.y ; y < r.y+r.h ; y++ ) - for( int x = r.x ; x < r.x+r.w ; x++ ) - if( x < _winrect.x || x > _winrect.x+_winrect.w || y < _winrect.y || y>_winrect.y+_winrect.h ){ - // On debloque la ressource - _mutex_hit.unlock(); - return true; - } - /* (3) On compare avec toutes les autres textures */ - for( int i = 0 ; i < _indexes.size() ; i++ ){ - - // Si c'est pas le sprite courant - if( _indexes[i] != current ){ - - // taille du sprite en cours - c.x = (*_dst[i]).x; - c.y = (*_dst[i]).y; - c.w = (*_dst[i]).w; - c.h = (*_dst[i]).h; - - for( int y = r.y ; y < r.y+r.h ; y++ ) - for( int x = r.x ; x < r.x+r.w ; x++ ) - if( x>=c.x && x<=c.x+c.w && y>=c.y && y<=c.y+c.h ){ - // On debloque la ressource - _mutex_hit.unlock(); - return true; - } - - } - - } - - // On debloque la ressource - _mutex_hit.unlock(); - - return false; - - -} @@ -158,7 +97,6 @@ bool xManager::hit(string current, int movex, int movey){ bool xManager::hit(SDL_Texture *current, int movex, int movey){ // Anti conflit inter-thread _mutex_hit.lock(); - /* (1) On recupere le SDL_Rect destination du sprite courant */ int xIndex = -1; @@ -172,17 +110,17 @@ bool xManager::hit(SDL_Texture *current, int movex, int movey){ } - SDL_Rect r = (SDL_Rect){ + SDL_Rect a = (SDL_Rect){ (*_dst[xIndex]).x+movex, (*_dst[xIndex]).y+movey, (*_dst[xIndex]).w, (*_dst[xIndex]).h }; - SDL_Rect c; + SDL_Rect b; /* (2) On regarde si en dehors de la fenetre */ - for( int y = r.y ; y < r.y+r.h ; y++ ) - for( int x = r.x ; x < r.x+r.w ; x++ ) + for( int y = a.y ; y < a.y+a.h ; y++ ) + for( int x = a.x ; x < a.x+a.w ; x++ ) if( x < _winrect.x || x > _winrect.x+_winrect.w || y < _winrect.y || y>_winrect.y+_winrect.h ){ // On debloque la ressource _mutex_hit.unlock(); @@ -197,14 +135,14 @@ bool xManager::hit(SDL_Texture *current, int movex, int movey){ if( _sprites[i] != current ){ // taille du sprite en cours - c.x = (*_dst[i]).x; - c.y = (*_dst[i]).y; - c.w = (*_dst[i]).w; - c.h = (*_dst[i]).h; + b.x = (*_dst[i]).x; + b.y = (*_dst[i]).y; + b.w = (*_dst[i]).w; + b.h = (*_dst[i]).h; - for( int y = r.y ; y < r.y+r.h ; y++ ) - for( int x = r.x ; x < r.x+r.w ; x++ ) - if( x>=c.x && x<=c.x+c.w && y>=c.y && y<=c.y+c.h ){ + for( int y = a.y ; y < a.y+a.h ; y++ ) + for( int x = a.x ; x < a.x+a.w ; x++ ) + if( x>=b.x && x<=b.x+b.w && y>=b.y && y<=b.y+b.h ){ // On debloque la ressource _mutex_hit.unlock(); return true; @@ -222,6 +160,107 @@ bool xManager::hit(SDL_Texture *current, int movex, int movey){ + + + +/* [HIT] Retourne si une texture est en collision avec une autre +=========================================================*/ +// bool xManager::hit(SDL_Texture *current, int movex, int movey){ +// // Anti conflit inter-thread +// _mutex_hit.lock(); + + +// /* (1) On recupere le SDL_Rect destination du sprite courant */ +// int xIndex = -1; +// for( int i = 0 ; i < _sprites.size() ; i++ ) +// if( _sprites[i] == current ) +// xIndex = i; + +// if( xIndex == -1 ){ +// _mutex_hit.unlock(); +// return false; +// } + + +// SDL_Rect a = (SDL_Rect){ +// (*_dst[xIndex]).x+movex, +// (*_dst[xIndex]).y+movey, +// (*_dst[xIndex]).w, +// (*_dst[xIndex]).h +// }; + + +// SDL_Rect b = _winrect; + +// /* (2) On regarde si en dehors de la fenetre */ +// if( !(a.x > b.x + b.w ) // Pas inclus a droite +// && !(a.x < b.x ) // Pas inclus a gauche +// && !(a.y < b.y ) // Pas inclus en haut +// && !(a.y > b.y + b.h ) // Pas inclus en bas +// ){ +// _mutex_hit.unlock(); +// return true; +// } + + +// /* (3) On compare avec toutes les autres textures */ +// for( int i = 0 ; i < _sprites.size() ; i++ ){ + +// // Si c'est pas le sprite courant +// if( _sprites[i] != current ){ + +// // taille du sprite en cours +// b.x = (*_dst[i]).x; +// b.y = (*_dst[i]).y; +// b.w = (*_dst[i]).w; +// b.h = (*_dst[i]).h; + +// // On verifie que le sprite n'entre pas en collision +// if( !( (a.x >= b.x + b.w ) // Pas inclus a droite +// || (a.x+a.w <= b.x ) // Pas inclus a gauche +// || (a.y+a.h <= b.y ) // Pas inclus en haut +// || (a.y >= b.y + b.h ) // Pas inclus en bas +// ) ){ +// cout << "YES collision" << endl; +// _mutex_hit.unlock(); +// return true; +// } + +// } + +// } + +// cout << "NO collision" << endl; + +// // On debloque la ressource +// _mutex_hit.unlock(); +// return false; +// } + + +/* [HIT] Retourne si une texture est en collision avec une autre +=========================================================*/ +bool xManager::hit(string current, int movex, int movey){ + _mutex_hit.lock(); + + /* (1) On recupere le SDL_Rect destination du sprite courant */ + SDL_Texture *texture = NULL; + texture = this->getTexture(current); + + // Gestion erreur + if( texture == NULL ){ + _mutex_hit.unlock(); + return false; + } + + // Retour du resultat + _mutex_hit.unlock(); + return this->hit(texture, movex, movey); +} + + + + /* [GETTEXTURE] Renvoie la texture =========================================================*/ SDL_Texture *xManager::getTexture(string index){ diff --git a/SDL#4/xSDL/xManager.h b/SDL#4/xSDL/xManager.h index 3d1d888..ae12c14 100644 --- a/SDL#4/xSDL/xManager.h +++ b/SDL#4/xSDL/xManager.h @@ -12,8 +12,8 @@ bool setBackground(Uint8 r=0xff, Uint8 g=0xff, Uint8 b=0xff, Uint8 a=0xff); bool setImage(const char *url); - bool hit(string current, int movex=0, int movey=0); // Gestion des collisions bool hit(SDL_Texture *current, int movex=0, int movey=0); // Gestion des collisions + bool hit(string current, int movex=0, int movey=0); // Gestion des collisions SDL_Texture *getTexture(string index); SDL_Rect *getSrc(string index); diff --git a/SDL#4/xSDL/xSprite.cpp b/SDL#4/xSDL/xSprite.cpp index 30d65ba..c006ca4 100644 --- a/SDL#4/xSDL/xSprite.cpp +++ b/SDL#4/xSDL/xSprite.cpp @@ -104,6 +104,7 @@ void xSprite::move(int x, int y){ int signofx = (x==0) ? 0 : x / abs(x); int signofy = (y==0) ? 0 : y / abs(y); + /* (2) Tant qu'on n'a pas bouge */ while( incrx != 0 || incry != 0 ){ @@ -114,6 +115,9 @@ void xSprite::move(int x, int y){ return; } + + // cout << "NO" << endl; + /* (4) Sinon, on decremente les deplacements alternativement */ if( moveY ) incry -= signofy; @@ -123,8 +127,10 @@ void xSprite::move(int x, int y){ moveY = !moveY; } - // Mise a jour - _manager->update(); + + // Mise a jour si on a bouge + // if( incrx != 0 && incry != 0 ) + _manager->update(); }