SDL#4 avancement general

This commit is contained in:
xdrm-brackets 2016-03-14 00:06:33 +01:00
parent a5f3faba73
commit 8671bdd9a5
14 changed files with 193 additions and 32 deletions

BIN
SDL#4/exe

Binary file not shown.

View File

@ -95,9 +95,10 @@ int main(int argc, char* argv[]) {
if( !mgr->hit("mario", 0, 5) ) if( !mgr->hit("mario", 0, 5) )
mario->move(0, 5); mario->move(0, 5);
if( mgr->hit("mystery-bloc", 0, 8) ) if( mgr->hit("mystery-bloc", 0, 7) )
mb.stop(); mb.jump();
else
mb.unjump();
mgr->manageFps(); // Gestion des FPS (speed) mgr->manageFps(); // Gestion des FPS (speed)
@ -170,8 +171,8 @@ void keydownEventHandler(SDL_Event *e){
break; break;
case SDLK_DOWN: case SDLK_DOWN:
down_move = true; // down_move = true;
mario->moveDown(&down_move); // mario->moveDown(&down_move);
break; break;
default: default:
@ -218,7 +219,7 @@ void keyupEventHandler(SDL_Event *e){
break; break;
case SDLK_DOWN: case SDLK_DOWN:
down_move = false; // down_move = false;
break; break;

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -1,5 +1,6 @@
A FAIRE A FAIRE
======= =======
- [ ] Gestion du saut unique ou double (limitation)
- [ ] Erreur a corriger pour xSpriteAnimation on doit faire start() mais push() puis start() (qui est equivalent) ne marche pas - [ ] Erreur a corriger pour xSpriteAnimation on doit faire start() mais push() puis start() (qui est equivalent) ne marche pas
- [ ] Gestion de l'acceleration - [ ] Gestion de l'acceleration
- [ ] Gestion de la gravite - [ ] Gestion de la gravite

View File

@ -47,13 +47,13 @@ xMarioMario::xMarioMario(xManager *m, int x, int y)
=========================================================*/ =========================================================*/
void xLeftMoveProcess(xMarioMario *m, bool *run){ void xLeftMoveProcess(xMarioMario *m, bool *run){
bool hasMoved = false; bool hasMoved = false;
int step = 5; int step = 3;
while( *run ){ while( *run ){
hasMoved = false; hasMoved = false;
step = 5; step = 3;
// Tant qu'on a pas bouge et qu'on peut se deplacer // Tant qu'on a pas bouge et qu'on peut se deplacer
while( !hasMoved && step > 0 ){ while( !hasMoved && step > 0 ){
@ -99,13 +99,13 @@ void xMarioMario::moveLeft(bool *run){
=========================================================*/ =========================================================*/
void xRightMoveProcess(xMarioMario *m, bool *run){ void xRightMoveProcess(xMarioMario *m, bool *run){
bool hasMoved = false; bool hasMoved = false;
int step = 5; int step = 3;
while( *run ){ while( *run ){
hasMoved = false; hasMoved = false;
step = 5; step = 3;
// Tant qu'on a pas bouge et qu'on peut se deplacer // Tant qu'on a pas bouge et qu'on peut se deplacer
while( !hasMoved && step > 0 ){ while( !hasMoved && step > 0 ){
@ -155,13 +155,13 @@ void xMarioMario::moveRight(bool *run){
=========================================================*/ =========================================================*/
void xUpMoveProcess(xMarioMario *m, bool *run){ void xUpMoveProcess(xMarioMario *m, bool *run){
bool hasMoved = false; bool hasMoved = false;
int step = 5; int step = 7;
while( *run ){ while( *run ){
hasMoved = false; hasMoved = false;
step = 5; step = 7;
// Tant qu'on a pas bouge et qu'on peut se deplacer // Tant qu'on a pas bouge et qu'on peut se deplacer
while( !hasMoved && step > 0 ){ while( !hasMoved && step > 0 ){

View File

@ -12,4 +12,99 @@ xMarioMysteryBloc::xMarioMysteryBloc(xManager *m, int x, int y)
this->addFrame( (SDL_Rect){0, 16, 16, 16} ); this->addFrame( (SDL_Rect){0, 16, 16, 16} );
this->addFrame( (SDL_Rect){0, 32, 16, 16} ); this->addFrame( (SDL_Rect){0, 32, 16, 16} );
this->addFrame( (SDL_Rect){0, 48, 16, 16} ); this->addFrame( (SDL_Rect){0, 48, 16, 16} );
_defaultrect = _viewport;
_lastjump = SDL_GetTicks();
_jumps = 0;
_active = true;
}
/* [JUMP] Animation d'activation (quand saut)
=========================================================*/
void xMarioMysteryBloc::jump(){
if( !this->active() )
return;
if( _defaultrect.y == _viewport.y && SDL_GetTicks()-_lastjump > 300 ){
_viewport.x = _defaultrect.x - _defaultrect.w*.1/2;
_viewport.y = _defaultrect.y-10 - _defaultrect.h*.1/2;
_viewport.w = _defaultrect.w * 1.1;
_viewport.h = _defaultrect.h * 1.1;
this->move(_viewport);
_lastjump = SDL_GetTicks();
_jumps++;
if( _jumps >= 6 )
this->active(false);
}
}
/* [UNJUMP] Animation d'activation (quand saut)
=========================================================*/
void xMarioMysteryBloc::unjump(){
// if( !this->active() )
// return;
if( _defaultrect.y != _viewport.y && SDL_GetTicks()-_lastjump > 100 ){
_viewport.x = _defaultrect.x;
_viewport.y = _defaultrect.y;
_viewport.w = _defaultrect.w;
_viewport.h = _defaultrect.h;
this->move(_viewport);
_lastjump = SDL_GetTicks();
}
}
/* [ACTIVE] Retourne l'etat du bouton
=========================================================*/
bool xMarioMysteryBloc::active(){
return _active;
}
/* [ACTIVE] Gestion du caractere "actif" du bouton
=========================================================*/
void xMarioMysteryBloc::active(bool active){
_active = active;
this->stop();
if( active ){
_frames.clear();
// for( int i = 0 ; i < _frames.size() ; i++ )
// _frames.erase(_frames.begin()+i);
this->addFrame( (SDL_Rect){0, 0, 16, 16} );
this->addFrame( (SDL_Rect){0, 16, 16, 16} );
this->addFrame( (SDL_Rect){0, 32, 16, 16} );
this->addFrame( (SDL_Rect){0, 48, 16, 16} );
}else{
_frames.clear();
// for( int i = 0 ; i < _frames.size() ; i++ )
// _frames.erase(_frames.begin()+i);
this->addFrame( (SDL_Rect){0, 64, 16, 16} );
}
this->start(_index, _timeout, _flags);
} }

View File

@ -6,6 +6,19 @@
public: public:
xMarioMysteryBloc(xManager *manager, int x, int y); // Spritesheet avec taille de chaque sprite xMarioMysteryBloc(xManager *manager, int x, int y); // Spritesheet avec taille de chaque sprite
void jump(); // Effectue l'animation d'activation
void unjump(); // Effectue l'animation d'activation
bool active(); // Retourne si le bloc est actif ou non
void active(bool active); // Active ou non le bloc
private:
bool _active;
int _jumps;
Uint32 _lastjump;
SDL_Rect _defaultrect;
}; };
#endif #endif

View File

@ -89,12 +89,17 @@ bool xManager::setImage(const char *url){
/* [HIT] Retourne si une texture est en collision avec une autre /* [HIT] Retourne si une texture est en collision avec une autre
=========================================================*/ =========================================================*/
bool xManager::hit(string current, int movex, int movey){ 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 */ /* (1) On recupere le SDL_Rect destination du sprite courant */
SDL_Rect *cRect = this->getDst(current); SDL_Rect *cRect = this->getDst(current);
// Gestion erreur // Gestion erreur
if( cRect == NULL ) if( cRect == NULL ){
_mutex_hit.unlock();
return false; return false;
}
SDL_Rect r = (SDL_Rect){ SDL_Rect r = (SDL_Rect){
(*cRect).x+movex, (*cRect).x+movex,
@ -107,8 +112,11 @@ bool xManager::hit(string current, int movex, int movey){
/* (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 = r.y ; y < r.y+r.h ; y++ )
for( int x = r.x ; x < r.x+r.w ; x++ ) 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 ) 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; return true;
}
/* (3) On compare avec toutes les autres textures */ /* (3) On compare avec toutes les autres textures */
@ -125,14 +133,22 @@ bool xManager::hit(string current, int movex, int movey){
for( int y = r.y ; y < r.y+r.h ; y++ ) for( int y = r.y ; y < r.y+r.h ; y++ )
for( int x = r.x ; x < r.x+r.w ; x++ ) 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 ) 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; return true;
} }
} }
}
// On debloque la ressource
_mutex_hit.unlock();
return false; return false;
} }
@ -140,14 +156,20 @@ bool xManager::hit(string current, int movex, int movey){
/* [HIT] Retourne si une texture est en collision avec une autre /* [HIT] Retourne si une texture est en collision avec une autre
=========================================================*/ =========================================================*/
bool xManager::hit(SDL_Texture *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 */ /* (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++ )
if( _sprites[i] == current ) if( _sprites[i] == current )
xIndex = i; xIndex = i;
if( xIndex == -1 ) if( xIndex == -1 ){
_mutex_hit.unlock();
return false; return false;
}
SDL_Rect r = (SDL_Rect){ SDL_Rect r = (SDL_Rect){
@ -161,8 +183,11 @@ bool xManager::hit(SDL_Texture *current, int movex, int movey){
/* (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 = r.y ; y < r.y+r.h ; y++ )
for( int x = r.x ; x < r.x+r.w ; x++ ) 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 ) 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; return true;
}
/* (3) On compare avec toutes les autres textures */ /* (3) On compare avec toutes les autres textures */
@ -179,13 +204,18 @@ bool xManager::hit(SDL_Texture *current, int movex, int movey){
for( int y = r.y ; y < r.y+r.h ; y++ ) for( int y = r.y ; y < r.y+r.h ; y++ )
for( int x = r.x ; x < r.x+r.w ; x++ ) 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 ) 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; return true;
}
} }
} }
// On debloque la ressource
_mutex_hit.unlock();
return false; return false;
} }
@ -236,7 +266,7 @@ SDL_Rect *xManager::getDst(string index){
=========================================================*/ =========================================================*/
void xManager::push(string index, SDL_Texture *t, SDL_Rect *src, SDL_Rect *dst){ void xManager::push(string index, SDL_Texture *t, SDL_Rect *src, SDL_Rect *dst){
// On bloque l'acces inter-thread // On bloque l'acces inter-thread
_mutex.lock(); _mutex_push.lock();
_indexes.push_back( index ); _indexes.push_back( index );
_sprites.push_back( t ); _sprites.push_back( t );
@ -244,7 +274,7 @@ void xManager::push(string index, SDL_Texture *t, SDL_Rect *src, SDL_Rect *dst){
_dst.push_back( dst ); _dst.push_back( dst );
// On debloque l'acces // On debloque l'acces
_mutex.unlock(); _mutex_push.unlock();
} }
@ -252,7 +282,7 @@ void xManager::push(string index, SDL_Texture *t, SDL_Rect *src, SDL_Rect *dst){
=========================================================*/ =========================================================*/
void xManager::pull(string index){ void xManager::pull(string index){
// On bloque l'acces inter-thread // On bloque l'acces inter-thread
_mutex.lock(); _mutex_pull.lock();
// On cherche l'indice de la texture // On cherche l'indice de la texture
int xIndex = -1; int xIndex = -1;
@ -271,7 +301,7 @@ void xManager::pull(string index){
_dst.erase( _dst.begin() + xIndex ); _dst.erase( _dst.begin() + xIndex );
// On debloque l'acces // On debloque l'acces
_mutex.unlock(); _mutex_pull.unlock();
} }
@ -279,7 +309,7 @@ void xManager::pull(string index){
=========================================================*/ =========================================================*/
void xManager::pull(SDL_Texture *t){ void xManager::pull(SDL_Texture *t){
// On bloque l'acces inter-thread // On bloque l'acces inter-thread
_mutex.lock(); _mutex_pull.lock();
// On cherche l'indice de la texture // On cherche l'indice de la texture
int xIndex = -1; int xIndex = -1;
@ -298,7 +328,7 @@ void xManager::pull(SDL_Texture *t){
_dst.erase( _dst.begin() + xIndex ); _dst.erase( _dst.begin() + xIndex );
// On debloque l'acces // On debloque l'acces
_mutex.unlock(); _mutex_pull.unlock();
} }
@ -334,7 +364,7 @@ void xManager::manageFps(const int fps){
void xManager::update(){ void xManager::update(){
// cout << "Update MAIN SPRITE +" << _sprites.size() << " added sprites.." << endl; // cout << "Update MAIN SPRITE +" << _sprites.size() << " added sprites.." << endl;
// On bloque l'acces inter-thread // On bloque l'acces inter-thread
_mutex.lock(); _mutex_update.lock();
/* (1) On efface le rendu */ /* (1) On efface le rendu */
SDL_RenderClear(_renderer); SDL_RenderClear(_renderer);
@ -358,7 +388,7 @@ void xManager::update(){
SDL_RenderPresent(_renderer); SDL_RenderPresent(_renderer);
// On debloque l'acces // On debloque l'acces
_mutex.unlock(); _mutex_update.unlock();
} }
/* [ATTACHEVENT] Ajoute une fonction a un type d'evenement /* [ATTACHEVENT] Ajoute une fonction a un type d'evenement

View File

@ -59,7 +59,10 @@
vector<SDL_Rect*> _dst; vector<SDL_Rect*> _dst;
// Protection thread-safe // Protection thread-safe
mutex _mutex; mutex _mutex_push;
mutex _mutex_pull;
mutex _mutex_update;
mutex _mutex_hit;
}; };

View File

@ -113,6 +113,8 @@ SDL_Rect *xSpriteAnimation::viewport(){ return &_viewport; }
/* [PUSH] Ajoute au rendu /* [PUSH] Ajoute au rendu
=========================================================*/ =========================================================*/
void xSpriteAnimation::push(string index){ void xSpriteAnimation::push(string index){
_index = index;
/* (1) On ajoute le sprite au rendu */ /* (1) On ajoute le sprite au rendu */
_manager->push(index, _texture, &_frame, &_viewport); _manager->push(index, _texture, &_frame, &_viewport);
} }
@ -121,6 +123,8 @@ void xSpriteAnimation::push(string index){
/* [PULL] Retire du rendu /* [PULL] Retire du rendu
=========================================================*/ =========================================================*/
void xSpriteAnimation::pull(string index){ void xSpriteAnimation::pull(string index){
_index = index;
/* (2) On retire le sprite du rendu */ /* (2) On retire le sprite du rendu */
_manager->pull(index); _manager->pull(index);
} }
@ -142,16 +146,15 @@ void xSpriteAnimation::pull(){
/* [TRHEAD] Process de l'animation /* [TRHEAD] Process de l'animation
=========================================================*/ =========================================================*/
void xSpriteAnimationProcess(xSpriteAnimation *xSA, int t, int flags){ void xSpriteAnimationProcess(xSpriteAnimation *xSA, int t, int flags){
int length = xSA->_frames.size();
int timer = 0; int timer = 0;
int step = 1; int step = 1;
int start = 0; int start = 0;
int stop = length; int stop = xSA->_frames.size();
while( flags&SPRITE_ANIM_INFINITE ){ while( flags&SPRITE_ANIM_INFINITE ){
/* (1) Pour chaque sprite */ /* (1) Pour chaque sprite */
for( int i = start ; i != stop ; i+=step ){ for( int i = start ; i != xSA->_frames.size() ; i+=step ){
timer = SDL_GetTicks(); timer = SDL_GetTicks();
@ -170,8 +173,8 @@ void xSpriteAnimationProcess(xSpriteAnimation *xSA, int t, int flags){
// SPRITE_ANIM_REVERSE // SPRITE_ANIM_REVERSE
if( flags&SPRITE_ANIM_REVERSE ){ if( flags&SPRITE_ANIM_REVERSE ){
step *= -1; step *= -1;
start = (step==1) ? 0 : length-1; start = (step==1) ? 0 : xSA->_frames.size()-1;
stop = (step==1) ? length-1 : 0; stop = (step==1) ? xSA->_frames.size()-1 : 0;
} }
} }
@ -188,6 +191,10 @@ void xSpriteAnimationProcess(xSpriteAnimation *xSA, int t, int flags){
/* [START] Ajoute l'animation au rendu /* [START] Ajoute l'animation au rendu
=========================================================*/ =========================================================*/
void xSpriteAnimation::start(string index, int t, int flags){ void xSpriteAnimation::start(string index, int t, int flags){
_index = index;
_timeout = t;
_flags = flags;
this->push(index); this->push(index);
/* (1) On lance l'animation */ /* (1) On lance l'animation */

View File

@ -41,6 +41,11 @@
vector<SDL_Rect> _frames; vector<SDL_Rect> _frames;
SDL_Rect _frame; // Frame courante SDL_Rect _frame; // Frame courante
// Nom
string _index;
int _timeout;
int _flags;
// Contiendra le thread de l'animation // Contiendra le thread de l'animation
thread *_animation; thread *_animation;
friend void xSpriteAnimationProcess(xSpriteAnimation *xSA, int t, int flags ); friend void xSpriteAnimationProcess(xSpriteAnimation *xSA, int t, int flags );

View File

@ -48,6 +48,8 @@ void xSpriteGroup::remove(xSprite *s){
/* [PUSH] Ajoute tous les xSprite du groupe a une surface parente /* [PUSH] Ajoute tous les xSprite du groupe a une surface parente
=========================================================*/ =========================================================*/
void xSpriteGroup::push(string index){ void xSpriteGroup::push(string index){
_index = index;
string newIndex; string newIndex;
for( int i = 0 ; i < _sprites.size() ; i++ ){ for( int i = 0 ; i < _sprites.size() ; i++ ){
@ -60,6 +62,8 @@ void xSpriteGroup::push(string index){
/* [PULL] Retire une sprite de la surface parents /* [PULL] Retire une sprite de la surface parents
=========================================================*/ =========================================================*/
void xSpriteGroup::pull(string index){ void xSpriteGroup::pull(string index){
_index = index;
string newIndex; string newIndex;
for( int i = 0 ; i < _sprites.size() ; i++ ){ for( int i = 0 ; i < _sprites.size() ; i++ ){

View File

@ -24,6 +24,8 @@
protected: protected:
vector<xSprite*> _sprites; vector<xSprite*> _sprites;
string _index;
}; };