- [x] Gestion velocite pour deplacement

- [x] Gestion de l'acceleration
- [x] Gestion de la gravite
This commit is contained in:
xdrm-brackets 2016-03-15 11:54:48 +01:00
parent b6f1715efc
commit 49e3a04a4c
5 changed files with 49 additions and 41 deletions

BIN
SDL#4/exe

Binary file not shown.

Binary file not shown.

View File

@ -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)
- [x] Auto-texture pour le sol (grass)
- [ABORT] Optimisation de update() pas dans boucle infinie, juste dans push/pull avec limitation FPS

View File

@ -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();

View File

@ -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++ ){