diff --git a/SDL#4/exe b/SDL#4/exe index 0925e3c..f652547 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 2e9fdaf..de95561 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 dc51034..3179f30 100644 --- a/SDL#4/todo.md +++ b/SDL#4/todo.md @@ -1,21 +1,20 @@ A FAIRE ======= - [ ] Ajout d'objets et non uniquement de SDL_Textures au xManager -- [ ] Optimisation de update() pas dans boucle infinie, juste dans push/pull avec limitation FPS - [x][ ] Gestion du saut unique ou double (limitation) -- [ ] Gestion de l'acceleration -- [ ] Gestion de la gravite -- [ ] Erreur de hit() EN COURS ======== - [ ] Optimisation/Correction des collisions + - [ ] Erreur de hit() - [ ] Liberation memoire car lag -- [ ] Gestion sprites de mario en fonction mouvement -- [...] Gestion velocite pour deplacement +- [...] Gestion sprites de mario en fonction mouvement FAIT ==== +- [x] Gestion velocite pour deplacement +- [x] Gestion de l'acceleration +- [x] Gestion de la gravite - [x] Erreur plus lent vers la droite - [x] Creation des briques - [x] Refactor xAnimation extends xSprite @@ -27,4 +26,6 @@ FAIT - [x] Index literaux pour ajouter au manager - [x] Auto-texture pour le bloc mystere - [x] Auto-texture pour le mario (avec mvmts) -- [x] Auto-texture pour le sol (grass) \ No newline at end of file +- [x] Auto-texture pour le sol (grass) + +- [ABORT] Optimisation de update() pas dans boucle infinie, juste dans push/pull avec limitation FPS \ No newline at end of file diff --git a/SDL#4/xMario/xMarioMario.cpp b/SDL#4/xMario/xMarioMario.cpp index f12649c..0fa0184 100644 --- a/SDL#4/xMario/xMarioMario.cpp +++ b/SDL#4/xMario/xMarioMario.cpp @@ -21,22 +21,22 @@ xMarioMario::xMarioMario(xManager *m, int x, int y) // Position frame par defaut _pos = "NR"; // bottom-center - _gravity = 13; + _gravity = 19; // Constantes de velocite sur X _velocity[0] = 0.0; _mult[0] = 10; - _dec[0] = 1; - _acc[0] = 5; + _dec[0] = .7; + _acc[0] = .6; _min_vel[0] = 0.1; - _max_vel[0] = 40; + _max_vel[0] = 10; // Constantes de velocite sur Y _velocity[1] = 0.0; _mult[1] = 50; - _dec[1] = 1; - _acc[1] = 10; - _min_vel[1] = 0.1; + _dec[1] = .3; + _acc[1] = 2; + _min_vel[1] = 0.2; _max_vel[1] = 100; /**/// this->addFrame( (SDL_Rect){2, 0, 19, 29} ); @@ -66,11 +66,21 @@ xMarioMario::xMarioMario(xManager *m, int x, int y) /* [MOVEFROMVELOCITY] Applique la velocite au deplacement =========================================================*/ -void xMarioMario::moveFromVelocity(){ +void xMarioMario::moveFromVelocity(){ + + /* (2) Si aucune collision, on deplace */ + this->move(_velocity[0], _velocity[1]); + cout << "x -> " << _velocity[0] << endl; + cout << "y -> " << _velocity[1] << endl; + + /* (3) Modification du sprite en fonction du mouvement */ + this->turn(); + /* (1) Gestion de touche encore enfoncee */ if( _left ) this->velocity(-1, 0); else if( _right ) this->velocity(1, 0); + else _velocity[0] *= ( 1 - _dec[0] ); // Si touche haut if( _up ){ @@ -81,40 +91,32 @@ void xMarioMario::moveFromVelocity(){ } }else _jumps = 0; - - - /* (2) Si aucune collision, on deplace */ - this->move(_velocity[0], _velocity[1]); - - /* (3) Modification du sprite en fonction du mouvement */ - this->turn(); - /* (4) On diminue la velocite (decceleration) */ - _velocity[0] *= ( 1 - _dec[0] ); _velocity[1] *= ( 1 - _dec[1] ); /* (5) Gestion de la gravite */ if( !this->onFloor() ) - this->move(0, 13); + this->move(0, _gravity); /* (6) Si velocite sous borne min */ - if( _velocity[0] < _min_vel[0] ) // sur x + if( abs(_velocity[0]) < _min_vel[0] ) // sur x _velocity[0] = 0; - if( _velocity[1] < _min_vel[1] ) // sur y + if( abs(_velocity[1]) < _min_vel[1] ) // sur y (gravite) _velocity[1] = 0; /* (7) Gestion du temps */ - if( abs(_velocity[0]) > 0 ) - cout << "x -> " << _velocity[0] << endl; + // if( abs(_velocity[0]) > 0 ) + // cout << "x -> " << _velocity[0] << endl; - if( abs(_velocity[1]) > 0 ) - cout << "y -> " << _velocity[1] << endl; + // if( abs(_velocity[1]) > 0 ) + // cout << "y -> " << _velocity[1] << endl; - usleep(1); + // cout << endl; + usleep(20000); } @@ -141,16 +143,20 @@ double xMarioMario::velocity(bool way){ void xMarioMario::velocity(double x, double y){ double last[] = { _velocity[0], _velocity[1] }; + // Vrai si on change pas de sens sur X + bool sameway_x = (last[0]*x) > 0; + // Vrai si on change pas de sens sur y + bool sameway_y = (last[1]*y) > 0; + /* (1) Gestion velocite axe X */ - if( last[0]*x > 0 ) // Si meme sens, on accelere - _velocity[0] *= _acc[0]; + if( sameway_x ) // Si meme sens, on accelere + _velocity[0] *= (1+_acc[0]); else _velocity[0] += x * _mult[0]; - /* (2) Gestion velocite axe Y */ - if( last[1]*y > 0 ) // Si meme sens, on accelere - _velocity[1] *= _acc[1]; + if( sameway_y ) // Si meme sens, on accelere + _velocity[1] *= (1+_acc[1]); else _velocity[1] += y * _mult[1]; @@ -194,7 +200,7 @@ void xMarioMario::turn(){ /* (1) Vers le haut */ - if( up ){ + if( up && !this->onFloor() ){ /* (1.2) HAUT - CENTRE */ if( centerx ){ // tc @@ -246,7 +252,7 @@ void xMarioMario::turn(){ /* (2.2) BAS - CENTRE */ - if( centerx ){ // bc + if( centerx && !this->onFloor() ){ // bc if( _pos != "BC" ){ this->pull(); this->clear(); diff --git a/SDL#4/xSDL/xManager.cpp b/SDL#4/xSDL/xManager.cpp index 9a4199d..f8e839e 100644 --- a/SDL#4/xSDL/xManager.cpp +++ b/SDL#4/xSDL/xManager.cpp @@ -97,7 +97,8 @@ bool xManager::setImage(const char *url){ 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++ ) @@ -126,7 +127,7 @@ bool xManager::hit(SDL_Texture *current, int movex, int movey){ _mutex_hit.unlock(); return true; } - + /* (3) On compare avec toutes les autres textures */ for( int i = 0 ; i < _sprites.size() ; i++ ){