Collisions a refactor et opti
This commit is contained in:
parent
7921efa3fc
commit
b6f1715efc
BIN
SDL#4/main.o
BIN
SDL#4/main.o
Binary file not shown.
|
@ -9,6 +9,7 @@ A FAIRE
|
||||||
|
|
||||||
EN COURS
|
EN COURS
|
||||||
========
|
========
|
||||||
|
- [ ] Optimisation/Correction des collisions
|
||||||
- [ ] Liberation memoire car lag
|
- [ ] Liberation memoire car lag
|
||||||
- [ ] Gestion sprites de mario en fonction mouvement
|
- [ ] Gestion sprites de mario en fonction mouvement
|
||||||
- [...] Gestion velocite pour deplacement
|
- [...] Gestion velocite pour deplacement
|
||||||
|
|
|
@ -29,6 +29,7 @@ xManager::xManager(const char *t, int w, int h){
|
||||||
|
|
||||||
// On enregistre les dimensions de la fenetre
|
// On enregistre les dimensions de la fenetre
|
||||||
_winrect.x = _winrect.y = 0;
|
_winrect.x = _winrect.y = 0;
|
||||||
|
_winrect.w = w; _winrect.h = h;
|
||||||
SDL_GetWindowSize(_window, &_winrect.w, &_winrect.h);
|
SDL_GetWindowSize(_window, &_winrect.w, &_winrect.h);
|
||||||
|
|
||||||
// Creation du renderer
|
// 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;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -159,7 +98,6 @@ bool xManager::hit(SDL_Texture *current, int movex, int movey){
|
||||||
// Anti conflit inter-thread
|
// Anti conflit inter-thread
|
||||||
_mutex_hit.lock();
|
_mutex_hit.lock();
|
||||||
|
|
||||||
|
|
||||||
/* (1) On recupere le SDL_Rect destination du sprite courant */
|
/* (1) On recupere le SDL_Rect destination du sprite courant */
|
||||||
int xIndex = -1;
|
int xIndex = -1;
|
||||||
for( int i = 0 ; i < _sprites.size() ; i++ )
|
for( int i = 0 ; i < _sprites.size() ; i++ )
|
||||||
|
@ -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]).x+movex,
|
||||||
(*_dst[xIndex]).y+movey,
|
(*_dst[xIndex]).y+movey,
|
||||||
(*_dst[xIndex]).w,
|
(*_dst[xIndex]).w,
|
||||||
(*_dst[xIndex]).h
|
(*_dst[xIndex]).h
|
||||||
};
|
};
|
||||||
SDL_Rect c;
|
SDL_Rect b;
|
||||||
|
|
||||||
/* (2) On regarde si en dehors de la fenetre */
|
/* (2) On regarde si en dehors de la fenetre */
|
||||||
for( int y = r.y ; y < r.y+r.h ; y++ )
|
for( int y = a.y ; y < a.y+a.h ; y++ )
|
||||||
for( int x = r.x ; x < r.x+r.w ; x++ )
|
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 ){
|
if( x < _winrect.x || x > _winrect.x+_winrect.w || y < _winrect.y || y>_winrect.y+_winrect.h ){
|
||||||
// On debloque la ressource
|
// On debloque la ressource
|
||||||
_mutex_hit.unlock();
|
_mutex_hit.unlock();
|
||||||
|
@ -197,14 +135,14 @@ bool xManager::hit(SDL_Texture *current, int movex, int movey){
|
||||||
if( _sprites[i] != current ){
|
if( _sprites[i] != current ){
|
||||||
|
|
||||||
// taille du sprite en cours
|
// taille du sprite en cours
|
||||||
c.x = (*_dst[i]).x;
|
b.x = (*_dst[i]).x;
|
||||||
c.y = (*_dst[i]).y;
|
b.y = (*_dst[i]).y;
|
||||||
c.w = (*_dst[i]).w;
|
b.w = (*_dst[i]).w;
|
||||||
c.h = (*_dst[i]).h;
|
b.h = (*_dst[i]).h;
|
||||||
|
|
||||||
for( int y = r.y ; y < r.y+r.h ; y++ )
|
for( int y = a.y ; y < a.y+a.h ; y++ )
|
||||||
for( int x = r.x ; x < r.x+r.w ; x++ )
|
for( int x = a.x ; x < a.x+a.w ; x++ )
|
||||||
if( x>=c.x && x<=c.x+c.w && y>=c.y && y<=c.y+c.h ){
|
if( x>=b.x && x<=b.x+b.w && y>=b.y && y<=b.y+b.h ){
|
||||||
// On debloque la ressource
|
// On debloque la ressource
|
||||||
_mutex_hit.unlock();
|
_mutex_hit.unlock();
|
||||||
return true;
|
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
|
/* [GETTEXTURE] Renvoie la texture
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
SDL_Texture *xManager::getTexture(string index){
|
SDL_Texture *xManager::getTexture(string index){
|
||||||
|
|
|
@ -12,8 +12,8 @@
|
||||||
bool setBackground(Uint8 r=0xff, Uint8 g=0xff, Uint8 b=0xff, Uint8 a=0xff);
|
bool setBackground(Uint8 r=0xff, Uint8 g=0xff, Uint8 b=0xff, Uint8 a=0xff);
|
||||||
bool setImage(const char *url);
|
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(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_Texture *getTexture(string index);
|
||||||
SDL_Rect *getSrc(string index);
|
SDL_Rect *getSrc(string index);
|
||||||
|
|
|
@ -104,6 +104,7 @@ void xSprite::move(int x, int y){
|
||||||
int signofx = (x==0) ? 0 : x / abs(x);
|
int signofx = (x==0) ? 0 : x / abs(x);
|
||||||
int signofy = (y==0) ? 0 : y / abs(y);
|
int signofy = (y==0) ? 0 : y / abs(y);
|
||||||
|
|
||||||
|
|
||||||
/* (2) Tant qu'on n'a pas bouge */
|
/* (2) Tant qu'on n'a pas bouge */
|
||||||
while( incrx != 0 || incry != 0 ){
|
while( incrx != 0 || incry != 0 ){
|
||||||
|
|
||||||
|
@ -114,6 +115,9 @@ void xSprite::move(int x, int y){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// cout << "NO" << endl;
|
||||||
|
|
||||||
/* (4) Sinon, on decremente les deplacements alternativement */
|
/* (4) Sinon, on decremente les deplacements alternativement */
|
||||||
if( moveY )
|
if( moveY )
|
||||||
incry -= signofy;
|
incry -= signofy;
|
||||||
|
@ -123,7 +127,9 @@ void xSprite::move(int x, int y){
|
||||||
moveY = !moveY;
|
moveY = !moveY;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mise a jour
|
|
||||||
|
// Mise a jour si on a bouge
|
||||||
|
// if( incrx != 0 && incry != 0 )
|
||||||
_manager->update();
|
_manager->update();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue