SDL#4 - [x] Gestion des collisions

- [x] Index literaux pour ajouter au manager
This commit is contained in:
xdrm-brackets 2016-03-13 18:33:47 +01:00
parent f909afad69
commit 57283f288a
17 changed files with 300 additions and 48 deletions

BIN
SDL#4/exe

Binary file not shown.

View File

@ -4,6 +4,7 @@
static xManager *mgr = NULL; static xManager *mgr = NULL;
static bool running = true; static bool running = true;
static xMarioMario *mario = NULL;
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
@ -27,11 +28,11 @@ int main(int argc, char* argv[]) {
=========================================================*/ =========================================================*/
// On cree un bout du terrain // On cree un bout du terrain
xMarioGrass btmleft(mgr, (SDL_Rect){-1, 20-2, 10, 3} ); xMarioGrass btmleft(mgr, (SDL_Rect){-1, 20-2, 10, 3} );
btmleft.push(); btmleft.push("bottom-left");
xMarioGrass floattcenter(mgr, (SDL_Rect){10, 10, 5, 5} ); xMarioGrass floattcenter(mgr, (SDL_Rect){10, 10, 5, 5} );
floattcenter.push(); floattcenter.push("float-center");
@ -39,15 +40,19 @@ int main(int argc, char* argv[]) {
=========================================================*/ =========================================================*/
// On cree une coquille verte // On cree une coquille verte
// xMarioGreenShell gs(mgr, 5, 20-3); // xMarioGreenShell gs(mgr, 5, 20-3);
// gs.start(100, SPRITE_ANIM_INFINITE); // gs.start("green-sheel", 100, SPRITE_ANIM_INFINITE);
// On cree un bloc mystere // On cree un bloc mystere
xMarioMysteryBloc mb(mgr, 5, 20-5); xMarioMysteryBloc mb(mgr, 5, 20-5);
mb.start(150, SPRITE_ANIM_INFINITE); mb.start("mystery-bloc", 150, SPRITE_ANIM_INFINITE);
// On cree un bloc normal // On cree un bloc normal
// xMarioBloc bl(mgr, (SDL_Rect){0, 20-2, 10, 3}); // xMarioBloc bl(mgr, (SDL_Rect){0, 20-2, 10, 3});
// bl.push(); // bl.push("bloc-bottom-left");
// On cree mario
mario = new xMarioMario(mgr, 5, 20-3);
mario->start("mario", 100, SPRITE_ANIM_INFINITE);
@ -109,5 +114,67 @@ void quitEventHandler(SDL_Event *e){
* *
*/ */
void keydownEventHandler(SDL_Event *e){ void keydownEventHandler(SDL_Event *e){
cout << "BAS" << endl; SDL_Rect *mRect = mario->viewport();
bool hasMoved = false;
int step = 20;
switch( (*e).key.keysym.sym ){
case SDLK_UP:
while( !hasMoved && step > 0 ){
if( !mgr->hit("mario", 0, -step) ){
mario->move(0, -step);
hasMoved = true;
}
step--;
}
break;
case SDLK_LEFT:
while( !hasMoved && step > 0 ){
if( !mgr->hit("mario", -step, 0) ){
mario->move(-step, 0);
hasMoved = true;
}
step--;
}
break;
case SDLK_RIGHT:
while( !hasMoved && step > 0 ){
if( !mgr->hit("mario", step, 0) ){
mario->move(step, 0);
hasMoved = true;
}
step--;
}
break;
case SDLK_DOWN:
while( !hasMoved && step > 0 ){
if( !mgr->hit("mario", 0, step) ){
mario->move(0, step);
hasMoved = true;
}
step--;
}
break;
default:
cout << "PRESSED" << endl;
break;
}
} }

Binary file not shown.

BIN
SDL#4/src/mario.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 MiB

After

Width:  |  Height:  |  Size: 120 KiB

View File

@ -1,8 +1,13 @@
A FAIRE A FAIRE
======= =======
- [x] Auto-texture pour le sol (grass) - [ ] Gestion de la gravite
FAIT FAIT
==== ====
- [x] Gestion des collisions
- [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)

View File

@ -13,6 +13,7 @@
/* [HEADERS] Inclusion des .h des sous-libs /* [HEADERS] Inclusion des .h des sous-libs
=========================================================*/ =========================================================*/
#include "xMario/xMarioMario.h"
#include "xMario/xMarioGrass.h" #include "xMario/xMarioGrass.h"
#include "xMario/xMarioGreenShell.h" #include "xMario/xMarioGreenShell.h"
#include "xMario/xMarioMysteryBloc.h" #include "xMario/xMarioMysteryBloc.h"
@ -21,6 +22,7 @@
/* [BODIES] Inclusion des .cpp des sous-libs /* [BODIES] Inclusion des .cpp des sous-libs
=========================================================*/ =========================================================*/
#include "xMario/xMarioMario.cpp"
#include "xMario/xMarioGrass.cpp" #include "xMario/xMarioGrass.cpp"
#include "xMario/xMarioGreenShell.cpp" #include "xMario/xMarioGreenShell.cpp"
#include "xMario/xMarioMysteryBloc.cpp" #include "xMario/xMarioMysteryBloc.cpp"

View File

@ -0,0 +1,37 @@
/* [CONSTRUCTOR] Construction d'un xMarioMario
=========================================================*/
xMarioMario::xMarioMario(xManager *m, int x, int y)
: xSpriteAnimation(
m,
"src/mario.png",
(SDL_Rect){
(int) (BLOC_SIZE*x+BLOC_SIZE*.1),
BLOC_SIZE*y,
(int) (BLOC_SIZE*.8),
BLOC_SIZE
}
){
// this->addFrame( (SDL_Rect){2, 0, 19, 29} );
// this->addFrame( (SDL_Rect){33, 0, 19, 29} );
// this->addFrame( (SDL_Rect){62, 0, 19, 29} );
// this->addFrame( (SDL_Rect){93, 0, 19, 29} );
// this->addFrame( (SDL_Rect){122, 0, 19, 29} );
// this->addFrame( (SDL_Rect){122, 0, 19, 29} );
// this->addFrame( (SDL_Rect){153, 0, 19, 29} );
// this->addFrame( (SDL_Rect){182, 0, 19, 29} );
// this->addFrame( (SDL_Rect){213, 0, 19, 29} );
this->addFrame( (SDL_Rect){238, 0, 19, 29} );
// this->addFrame( (SDL_Rect){269, 0, 19, 29} );
// this->addFrame( (SDL_Rect){298, 0, 19, 29} );
// this->addFrame( (SDL_Rect){329, 0, 19, 29} );
// /* (1) On definit les clip de chaque frame */
// this->addFrame( (SDL_Rect){21, 0, 18, 32} );
// this->addFrame( (SDL_Rect){42, 0, 18, 32} );
// this->addFrame( (SDL_Rect){63, 0, 18, 32} );
// this->addFrame( (SDL_Rect){82, 0, 18, 32} );
// this->addFrame( (SDL_Rect){103, 0, 18, 32} );
// this->addFrame( (SDL_Rect){125, 0, 18, 32} );
}

View File

@ -0,0 +1,15 @@
#ifndef DEF_XMARIOMARIO_H
#define DEF_XMARIOMARIO_H
class xMarioMario : public xSpriteAnimation{
public:
xMarioMario(xManager *manager, int x, int y); // Spritesheet avec taille de chaque sprite
private:
Uint32 _lastmove;
float _acceleration;
};
#endif

View File

@ -86,15 +86,101 @@ 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){
/* (1) On recupere le SDL_Rect destination du sprite courant */
SDL_Rect *cRect = this->getDst(current);
// Gestion erreur
if( cRect == NULL )
return false;
SDL_Rect r = (SDL_Rect){
(*cRect).x+movex,
(*cRect).y+movey,
(*cRect).w,
(*cRect).h
};
SDL_Rect c;
/* (2) 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 )
return true;
}
}
return false;
}
/* [GETTEXTURE] Renvoie la texture
=========================================================*/
SDL_Texture *xManager::getTexture(string index){
// On cherche la texture avec l'index
for( int i = 0 ; i < _indexes.size() ; i++ )
if( _indexes[i] == index )
return _sprites[i];
return NULL;
}
/* [GETSRC] Renvoie le SDL_Rect source
=========================================================*/
SDL_Rect *xManager::getSrc(string index){
// On cherche la texture avec l'index
for( int i = 0 ; i < _indexes.size() ; i++ )
if( _indexes[i] == index )
return _src[i];
return NULL;
}
/* [GETDST] Renvoie le SDL_Rect destination
=========================================================*/
SDL_Rect *xManager::getDst(string index){
// On cherche la texture avec l'index
for( int i = 0 ; i < _indexes.size() ; i++ )
if( _indexes[i] == index )
return _dst[i];
return NULL;
}
/* [PUSH] Ajoute une texture au rendu principal /* [PUSH] Ajoute une texture au rendu principal
=========================================================*/ =========================================================*/
void xManager::push(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.lock();
_sprites.push_back( t ); _indexes.push_back( index );
_src.push_back( src ); _sprites.push_back( t );
_dst.push_back( dst ); _src.push_back( src );
_dst.push_back( dst );
// On debloque l'acces // On debloque l'acces
_mutex.unlock(); _mutex.unlock();
@ -103,24 +189,25 @@ void xManager::push(SDL_Texture *t, SDL_Rect *src, SDL_Rect *dst){
/* [PULL] Retire une texture du rendu principal /* [PULL] Retire une texture du rendu principal
=========================================================*/ =========================================================*/
void xManager::pull(SDL_Texture *t){ void xManager::pull(string index, SDL_Texture *t){
// On bloque l'acces inter-thread // On bloque l'acces inter-thread
_mutex.lock(); _mutex.lock();
// On cherche l'indice de la texture // On cherche l'indice de la texture
int index = -1; int xIndex = -1;
for( int i = 0 ; i < _sprites.size() ; i++ ) for( int i = 0 ; i < _indexes.size() ; i++ )
if( _sprites[i] == t ) index = i; if( _indexes[i] == index ) xIndex = i;
// Si on a rien trouve // Si on a rien trouve
if( index == -1 ) if( xIndex == -1 )
return; return;
// On supprime la texture et ses dimensions // On supprime la texture et ses dimensions
_sprites.erase( _sprites.begin() + index ); _indexes.erase( _indexes.begin() + xIndex );
_src.erase( _src.begin() + index ); _sprites.erase( _sprites.begin() + xIndex );
_dst.erase( _dst.begin() + index ); _src.erase( _src.begin() + xIndex );
_dst.erase( _dst.begin() + xIndex );
// On debloque l'acces // On debloque l'acces
_mutex.unlock(); _mutex.unlock();

View File

@ -12,8 +12,13 @@
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);
void push(SDL_Texture *t, SDL_Rect *origin, SDL_Rect *dest); bool hit(string current, int movex=0, int movey=0); // Gestion des collisions
void pull(SDL_Texture *t);
SDL_Texture *getTexture(string index);
SDL_Rect *getSrc(string index);
SDL_Rect *getDst(string index);
void push(string index, SDL_Texture *t, SDL_Rect *origin, SDL_Rect *dest);
void pull(string index, SDL_Texture *t);
void update(); void update();
@ -45,9 +50,10 @@
SDL_Texture *_texture; SDL_Texture *_texture;
// Gestion des textures // Gestion des textures
vector<string> _indexes;
vector<SDL_Texture*> _sprites; vector<SDL_Texture*> _sprites;
vector<SDL_Rect*> _src; vector<SDL_Rect*> _src;
vector<SDL_Rect*> _dst; vector<SDL_Rect*> _dst;
// Protection thread-safe // Protection thread-safe
mutex _mutex; mutex _mutex;

View File

@ -103,14 +103,14 @@ void xSprite::dimensions(SDL_Rect r, SDL_Rect clip){
/* [PUSH] Ajoute le xSprite au rendu /* [PUSH] Ajoute le xSprite au rendu
=========================================================*/ =========================================================*/
void xSprite::push(){ void xSprite::push(string index){
_manager->push(_texture, &_src, &_dst); _manager->push(index, _texture, &_src, &_dst);
} }
/* [PULL] Retire une sprite du rendu /* [PULL] Retire une sprite du rendu
=========================================================*/ =========================================================*/
void xSprite::pull(){ void xSprite::pull(string index){
_manager->pull( _texture ); _manager->pull( index, _texture );
} }
/* [UPDATE] Mise a jour du rendu /* [UPDATE] Mise a jour du rendu

View File

@ -15,8 +15,8 @@
void dimensions(SDL_Rect r); // Dimensions sortie void dimensions(SDL_Rect r); // Dimensions sortie
void dimensions(SDL_Rect r, SDL_Rect clip); // Dimensions in/out void dimensions(SDL_Rect r, SDL_Rect clip); // Dimensions in/out
void push(); // Ajoute a l'affichage void push(string index); // Ajoute a l'affichage
void pull(); // Retire de l'affichage void pull(string index); // Retire de l'affichage
void update(); // Fait renmonter la mise a jour du manager void update(); // Fait renmonter la mise a jour du manager

View File

@ -47,10 +47,25 @@ xSpriteAnimation::xSpriteAnimation(xManager *manager, SDL_Texture *t, SDL_Rect v
/* [MOVE] Modification de la position/taille du sprite /* [MOVE] Modification de la position/taille du sprite
=========================================================*/ =========================================================*/
void xSpriteAnimation::move(SDL_Rect newpos){ void xSpriteAnimation::move(SDL_Rect newpos){
_viewport.x = newpos.x; if( newpos.x != 0 )
_viewport.y = newpos.y; _viewport.x = newpos.x;
_viewport.w = newpos.w;
_viewport.h = newpos.h; if( newpos.y != 0 )
_viewport.y = newpos.y;
if( newpos.w != 0 )
_viewport.w = newpos.w;
if( newpos.h != 0)
_viewport.h = newpos.h;
}
/* [MOVE] Deplacement de la position/taille du sprite
=========================================================*/
void xSpriteAnimation::move(int x, int y){
_viewport.x += x;
_viewport.y += y;
} }
@ -75,6 +90,11 @@ void xSpriteAnimation::addFrame(SDL_Rect clip){
xManager *xSpriteAnimation::manager(){ return _manager; } xManager *xSpriteAnimation::manager(){ return _manager; }
/* [VIEWPORT] Retourne le viewport
=========================================================*/
SDL_Rect *xSpriteAnimation::viewport(){ return &_viewport; }
/* [TRHEAD] Process de l'animation /* [TRHEAD] Process de l'animation
=========================================================*/ =========================================================*/
@ -126,9 +146,9 @@ void xSpriteAnimationProcess(xSpriteAnimation *xSA, int t, int flags){
/* [START] Ajoute l'animation au rendu /* [START] Ajoute l'animation au rendu
=========================================================*/ =========================================================*/
void xSpriteAnimation::start(int t, int flags){ void xSpriteAnimation::start(string index, int t, int flags){
/* (1) On ajoute le sprite au rendu */ /* (1) On ajoute le sprite au rendu */
_manager->push(_texture, &_frame, &_viewport); _manager->push(index, _texture, &_frame, &_viewport);
/* (2) On lance l'animation */ /* (2) On lance l'animation */
_animation = new thread(xSpriteAnimationProcess, this, t, flags); _animation = new thread(xSpriteAnimationProcess, this, t, flags);
@ -141,10 +161,10 @@ void xSpriteAnimation::start(int t, int flags){
/* [STOP] Arrete l'animation /* [STOP] Arrete l'animation
=========================================================*/ =========================================================*/
void xSpriteAnimation::stop(){ void xSpriteAnimation::stop(string index){
/* (1) On arrete l'animation */ /* (1) On arrete l'animation */
delete _animation; delete _animation;
/* (2) On retire le sprite du rendu */ /* (2) On retire le sprite du rendu */
_manager->pull(_texture); _manager->pull(index, _texture);
} }

View File

@ -10,15 +10,18 @@
~xSpriteAnimation(); ~xSpriteAnimation();
void move(SDL_Rect newpos); // Deplace l'animation void move(SDL_Rect newpos); // Deplace l'animation
void move(int x, int y); // Deplace l'animation
void addFrame(SDL_Rect clip); // Ajoute une frame en fonction des coordonnees void addFrame(SDL_Rect clip); // Ajoute une frame en fonction des coordonnees
// GETTER // GETTER
xManager *manager(); xManager *manager();
SDL_Rect *viewport();
// Gestion de l'animation // Gestion de l'animation
void start(int t, int flags=SPRITE_ANIM_ONCE); void start(string index, int t, int flags=SPRITE_ANIM_ONCE);
void stop(); void stop(string index);

View File

@ -47,16 +47,26 @@ 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(){ void xSpriteGroup::push(string index){
for( int i = 0 ; i < _sprites.size() ; i++ ) string newIndex;
_sprites[i]->push();
for( int i = 0 ; i < _sprites.size() ; i++ ){
newIndex = index;
newIndex += to_string(i);
_sprites[i]->push(newIndex);
}
} }
/* [PULL] Retire une sprite de la surface parents /* [PULL] Retire une sprite de la surface parents
=========================================================*/ =========================================================*/
void xSpriteGroup::pull(){ void xSpriteGroup::pull(string index){
for( int i = 0 ; i < _sprites.size() ; i++ ) string newIndex;
_sprites[i]->pull();
for( int i = 0 ; i < _sprites.size() ; i++ ){
newIndex = index;
newIndex += to_string(i);
_sprites[i]->pull(newIndex);
}
} }

View File

@ -15,8 +15,8 @@
void remove(xSprite *s); void remove(xSprite *s);
xSprite* get(int i); xSprite* get(int i);
void push(); // Ajoute les sprites a l'affichage void push(string index); // Ajoute les sprites a l'affichage
void pull(); // Retire les sprites de l'affichage void pull(string index); // Retire les sprites de l'affichage
void update(); // Fait renmonter la mise a jour du manager void update(); // Fait renmonter la mise a jour du manager