- [x] Gestion du nombre de saut avant de casser Brick ou MysteryBloc

This commit is contained in:
xdrm-brackets 2016-03-16 12:08:22 +01:00
parent 6f9d7dc40f
commit a3c7418bb1
11 changed files with 183 additions and 22 deletions

BIN
SDL#4/exe

Binary file not shown.

View File

@ -53,28 +53,28 @@ int main(int argc, char* argv[]) {
gs.start(100, SPRITE_ANIM_INFINITE); gs.start(100, SPRITE_ANIM_INFINITE);
// On cree une brique // On cree une brique
xMarioBrick mbr1(mgr, 4, 20-6); xMarioBrick mbr1(mgr, 4, 20-6, 1); // 1 saut
mbr1.push("brick1"); mbr1.push("brick1");
// On cree un bloc mystere // On cree un bloc mystere
xMarioMysteryBloc mb(mgr, 5, 20-6); xMarioMysteryBloc mb(mgr, 5, 20-6, 2); // 2 sauts
mb.push("mystery-bloc"); mb.push("mystery-bloc");
mb.start(150, SPRITE_ANIM_INFINITE); mb.start(150, SPRITE_ANIM_INFINITE);
// On cree une brique // On cree une brique
xMarioBrick mbr2(mgr, 6, 20-6); xMarioBrick mbr2(mgr, 6, 20-6, 2); // 2 sauts
mbr2.push("brick2"); mbr2.push("brick2");
xMarioMysteryBloc mb1(mgr, 15, 20-6); xMarioMysteryBloc mb1(mgr, 15, 20-6, 1); // 1 saut
mb1.push("mystery-bloc2"); mb1.push("mystery-bloc2");
mb1.start(150, SPRITE_ANIM_INFINITE); mb1.start(150, SPRITE_ANIM_INFINITE);
xMarioMysteryBloc mb2(mgr, 17, 20-5); xMarioMysteryBloc mb2(mgr, 17, 20-5, 1); // 1 saut
mb2.push("mystery-bloc3"); mb2.push("mystery-bloc3");
mb2.start(150, SPRITE_ANIM_INFINITE); mb2.start(150, SPRITE_ANIM_INFINITE);
xMarioMysteryBloc mb3(mgr, 19, 20-4); xMarioMysteryBloc mb3(mgr, 19, 20-4, 6); // 6 sauts
mb3.push("mystery-bloc4"); mb3.push("mystery-bloc4");
mb3.start(150, SPRITE_ANIM_INFINITE); mb3.start(150, SPRITE_ANIM_INFINITE);
@ -126,6 +126,13 @@ int main(int argc, char* argv[]) {
mario->moveFromVelocity(); mario->moveFromVelocity();
if( mgr->hit("brick1", 0, 1) ) mbr1.jump();
else mbr1.unjump();
if( mgr->hit("brick2", 0, 1) ) mbr2.jump();
else mbr2.unjump();
if( mgr->hit("mystery-bloc", 0, 1) ) mb.jump(); if( mgr->hit("mystery-bloc", 0, 1) ) mb.jump();
else mb.unjump(); else mb.unjump();

Binary file not shown.

View File

@ -1,19 +1,20 @@
A FAIRE A FAIRE
======= =======
- [ ] Verifier toute la trajectoire pour move()
- [x][ ] Gestion du saut unique ou double (limitation) - [x][ ] Gestion du saut unique ou double (limitation)
EN COURS EN COURS
======== ========
- [ ] Optimisation/Correction des collisions (hit + move)
- [ ] Erreur de hit()
- [x] Optimisation de la correction apres saut
- [x] Correction du move qui fait friser parfois
- [ ] Liberation memoire car lag - [ ] Liberation memoire car lag
- [...] Gestion sprites de mario en fonction mouvement - [...] Gestion sprites de mario en fonction mouvement
FAIT FAIT
==== ====
- [x] Gestion du nombre de saut avant de casser Brick ou MysteryBloc
- [x] Optimisation/Correction des collisions (hit + move)
- [x] Erreur de hit() (gravity)
- [x] Optimisation de la correction apres saut
- [x] Correction du move qui fait friser parfois
- [x] @pushsprites Ajout de Sprites et non uniquement de SDL_Textures au xManager - [x] @pushsprites Ajout de Sprites et non uniquement de SDL_Textures au xManager
- [x] Permettre a move() de renvoyer qqch - [x] Permettre a move() de renvoyer qqch
- [x] Gestion velocite pour deplacement - [x] Gestion velocite pour deplacement

View File

@ -1,6 +1,6 @@
/* [CONSTRUCTOR] Construction d'un xMarioBrick /* [CONSTRUCTOR] Construction d'un xMarioBrick
=========================================================*/ =========================================================*/
xMarioBrick::xMarioBrick(xManager *m, int x, int y) xMarioBrick::xMarioBrick(xManager *m, int x, int y, int nb)
: xSprite( : xSprite(
m, m,
"src/blocs.png" "src/blocs.png"
@ -17,4 +17,81 @@ xMarioBrick::xMarioBrick(xManager *m, int x, int y)
(SDL_Rect){136, 0, 16, 16} // On definit le clip (SDL_Rect){136, 0, 16, 16} // On definit le clip
); );
_defaultrect = _dst;
_lastjump = SDL_GetTicks();
_jumps = 0;
_active = true;
_nb_jumps = nb;
}
/* [JUMP] Animation d'activation (quand saut)
=========================================================*/
void xMarioBrick::jump(){
if( !this->active() )
return;
if( _defaultrect.y == _dst.y && SDL_GetTicks()-_lastjump > 100 ){
this->move(0, -2);
_lastjump = SDL_GetTicks();
_jumps++;
if( _jumps >= _nb_jumps )
this->active(false);
}
}
/* [UNJUMP] Animation d'activation (quand saut)
=========================================================*/
void xMarioBrick::unjump(){
if( (_defaultrect.y-2) == _dst.y && SDL_GetTicks()-_lastjump > 100 ){
this->move(0, 2);
_lastjump = SDL_GetTicks();
}
}
/* [ACTIVE] Retourne l'etat du bouton
=========================================================*/
bool xMarioBrick::active(){
return _active;
}
/* [ACTIVE] Gestion du caractere "actif" du bouton
=========================================================*/
void xMarioBrick::active(bool active){
_active = active;
// actif, on affiche
if( active )
this->push(_index);
// sinon on enleve
else
this->pull();
}
/* [ONCOLLIDE] Gestion des collisions
=========================================================*/
void xMarioBrick::onCollide(vector<int> from, xSprite* by){
/* (1) Saut de mario */
if( by->getType() == "Mario" && from[1] == 1 )
cout << "JUMP JUMP" << endl;
} }

View File

@ -7,10 +7,25 @@
class xMarioBrick : public xSprite{ class xMarioBrick : public xSprite{
public: public:
xMarioBrick(xManager *m, int x, int y); xMarioBrick(xManager *m, int x, int y, int nb=1);
// Surcharge parent
void onCollide(vector<int> from, xSprite* by);
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: private:
xManager *_manager; bool _active;
int _jumps;
Uint32 _lastjump;
SDL_Rect _defaultrect;
int _nb_jumps; // nombre de coups avant de casser
}; };

View File

@ -1,6 +1,6 @@
/* [CONSTRUCTOR] Construction d'un xMarioGreenShell /* [CONSTRUCTOR] Construction d'un xMarioGreenShell
=========================================================*/ =========================================================*/
xMarioMysteryBloc::xMarioMysteryBloc(xManager *m, int x, int y) xMarioMysteryBloc::xMarioMysteryBloc(xManager *m, int x, int y, int nb)
: xSpriteAnimation( : xSpriteAnimation(
m, m,
"src/myst_bloc.png", "src/myst_bloc.png",
@ -18,6 +18,7 @@ xMarioMysteryBloc::xMarioMysteryBloc(xManager *m, int x, int y)
_lastjump = SDL_GetTicks(); _lastjump = SDL_GetTicks();
_jumps = 0; _jumps = 0;
_active = true; _active = true;
_nb_jumps = nb;
} }
@ -30,15 +31,15 @@ void xMarioMysteryBloc::jump(){
if( !this->active() ) if( !this->active() )
return; return;
if( _defaultrect.y == _dst.y && SDL_GetTicks()-_lastjump > 300 ){ if( _defaultrect.y == _dst.y && SDL_GetTicks()-_lastjump > 100 ){
this->move(0, -10); this->move(0, -5);
_lastjump = SDL_GetTicks(); _lastjump = SDL_GetTicks();
_jumps++; _jumps++;
if( _jumps >= 6 ) if( _jumps >= _nb_jumps )
this->active(false); this->active(false);
} }
} }
@ -47,9 +48,9 @@ void xMarioMysteryBloc::jump(){
/* [UNJUMP] Animation d'activation (quand saut) /* [UNJUMP] Animation d'activation (quand saut)
=========================================================*/ =========================================================*/
void xMarioMysteryBloc::unjump(){ void xMarioMysteryBloc::unjump(){
if( (_defaultrect.y-10) == _dst.y && SDL_GetTicks()-_lastjump > 100 ){ if( (_defaultrect.y-5) == _dst.y && SDL_GetTicks()-_lastjump > 100 ){
this->move(0, 10); this->move(0, 5);
_lastjump = SDL_GetTicks(); _lastjump = SDL_GetTicks();
} }

View File

@ -5,7 +5,7 @@
class xMarioMysteryBloc : public xSpriteAnimation{ class xMarioMysteryBloc : public xSpriteAnimation{
public: public:
xMarioMysteryBloc(xManager *manager, int x, int y); // Spritesheet avec taille de chaque sprite xMarioMysteryBloc(xManager *manager, int x, int y, int nb=1); // Spritesheet avec taille de chaque sprite
// Surcharge parent // Surcharge parent
void onCollide(vector<int> from, xSprite* by); void onCollide(vector<int> from, xSprite* by);
@ -23,6 +23,8 @@
Uint32 _lastjump; Uint32 _lastjump;
SDL_Rect _defaultrect; SDL_Rect _defaultrect;
int _nb_jumps; // nombre de coups avant de casser
}; };

View File

@ -34,7 +34,7 @@ xMarioMario::xMarioMario(xManager *m, int x, int y)
// Constantes de mouvement sur Y // Constantes de mouvement sur Y
_velocity[1] = 0.0; _velocity[1] = 0.0;
_mult[1] = 50; _mult[1] = 40;
_dec[1] = .3; _dec[1] = .3;
_acc[1] = 3; _acc[1] = 3;
_min_vel[1] = 0.2; _min_vel[1] = 0.2;

View File

@ -78,6 +78,59 @@ xSprite::xSprite(xManager *m, SDL_Texture *t){
/* [SETTEXTURE] Modification de la texture avec couleur
=========================================================*/
void xSprite::setTexture(const int rgb[]){
_texture = NULL;
SDL_Surface *surf = SDL_CreateRGBSurface(0, 0, 0, 32, 0, 0, 0, rgb[3]);
// On recupere la couleur
Uint32 color = SDL_MapRGBA( surf->format, rgb[0], rgb[1], rgb[2], rgb[3]);
// On cree la texture a partir de la surface
_texture = SDL_CreateTextureFromSurface(_manager->renderer(), surf);
// On libere la surface inutile maintenant
SDL_FreeSurface( surf );
surf = NULL;
}
/* [SETTEXTURE] Modification de la texture avec image
=========================================================*/
void xSprite::setTexture(const char *url){
_texture = NULL;
/* (1) On cree la texture directement */
_texture = IMG_LoadTexture(_manager->renderer(), url);
// Gestion erreur
if( _texture == NULL )
return;
}
/* [SETTEXTURE] Modification de la texture texture
=========================================================*/
void xSprite::setTexture(SDL_Texture *t){
_type = "basic";
_texture = NULL;
_texture = t;
// Gestion erreur
if( _texture == NULL )
return;
}
/* [MOVE] Modification de la position/taille du sprite /* [MOVE] Modification de la position/taille du sprite
=========================================================*/ =========================================================*/
vector<int> xSprite::move(SDL_Rect newpos){ vector<int> xSprite::move(SDL_Rect newpos){

View File

@ -11,6 +11,11 @@
xSprite(xManager *m, SDL_Texture *t); // Sprite texture xSprite(xManager *m, SDL_Texture *t); // Sprite texture
~xSprite(); ~xSprite();
// Modifications de la texture
void setTexture(const int rgb[]); // Sprite couleur
void setTexture(const char *url); // Sprite image
void setTexture(SDL_Texture *t); // Sprite texture
vector<int> move(SDL_Rect newpos); // Deplace le sprite vector<int> move(SDL_Rect newpos); // Deplace le sprite
vector<int> move(int x, int y); // Deplace le sprite vector<int> move(int x, int y); // Deplace le sprite