Debut correction
This commit is contained in:
parent
57283f288a
commit
a5f3faba73
128
SDL#4/main.cpp
128
SDL#4/main.cpp
|
@ -6,6 +6,11 @@ static bool running = true;
|
||||||
|
|
||||||
static xMarioMario *mario = NULL;
|
static xMarioMario *mario = NULL;
|
||||||
|
|
||||||
|
static bool left_move = false;
|
||||||
|
static bool right_move = false;
|
||||||
|
static bool up_move = false;
|
||||||
|
static bool down_move = false;
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
srand(time(0));
|
srand(time(0));
|
||||||
|
@ -30,6 +35,10 @@ int main(int argc, char* argv[]) {
|
||||||
xMarioGrass btmleft(mgr, (SDL_Rect){-1, 20-2, 10, 3} );
|
xMarioGrass btmleft(mgr, (SDL_Rect){-1, 20-2, 10, 3} );
|
||||||
btmleft.push("bottom-left");
|
btmleft.push("bottom-left");
|
||||||
|
|
||||||
|
// On cree un bout du terrain
|
||||||
|
xMarioGrass btmcenter(mgr, (SDL_Rect){13, 20-3, 10, 3} );
|
||||||
|
btmcenter.push("bottom-center");
|
||||||
|
|
||||||
|
|
||||||
xMarioGrass floattcenter(mgr, (SDL_Rect){10, 10, 5, 5} );
|
xMarioGrass floattcenter(mgr, (SDL_Rect){10, 10, 5, 5} );
|
||||||
floattcenter.push("float-center");
|
floattcenter.push("float-center");
|
||||||
|
@ -44,6 +53,7 @@ int main(int argc, char* argv[]) {
|
||||||
|
|
||||||
// On cree un bloc mystere
|
// On cree un bloc mystere
|
||||||
xMarioMysteryBloc mb(mgr, 5, 20-5);
|
xMarioMysteryBloc mb(mgr, 5, 20-5);
|
||||||
|
// mb.push("mystery-bloc");
|
||||||
mb.start("mystery-bloc", 150, SPRITE_ANIM_INFINITE);
|
mb.start("mystery-bloc", 150, SPRITE_ANIM_INFINITE);
|
||||||
|
|
||||||
// On cree un bloc normal
|
// On cree un bloc normal
|
||||||
|
@ -52,19 +62,24 @@ int main(int argc, char* argv[]) {
|
||||||
|
|
||||||
// On cree mario
|
// On cree mario
|
||||||
mario = new xMarioMario(mgr, 5, 20-3);
|
mario = new xMarioMario(mgr, 5, 20-3);
|
||||||
|
// mb.push("mario");
|
||||||
mario->start("mario", 100, SPRITE_ANIM_INFINITE);
|
mario->start("mario", 100, SPRITE_ANIM_INFINITE);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* [n-1] Boucle infinie
|
/* [n-1] Boucle infinie
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
|
|
||||||
// Gestion des evenements
|
// Gestion des evenements
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
mgr->attachEvent(SDL_KEYDOWN, &keydownEventHandler);
|
mgr->attachEvent(SDL_KEYDOWN, &keydownEventHandler);
|
||||||
|
mgr->attachEvent(SDL_KEYUP, &keyupEventHandler);
|
||||||
mgr->attachEvent(SDL_QUIT, &quitEventHandler);
|
mgr->attachEvent(SDL_QUIT, &quitEventHandler);
|
||||||
|
left_move = false;
|
||||||
|
right_move = false;
|
||||||
|
up_move = false;
|
||||||
|
down_move = false;
|
||||||
|
|
||||||
// Boucle de traitement
|
// Boucle de traitement
|
||||||
mgr->update(); mgr->update();
|
mgr->update(); mgr->update();
|
||||||
|
@ -76,6 +91,13 @@ int main(int argc, char* argv[]) {
|
||||||
while( SDL_PollEvent(&event) != 0 )
|
while( SDL_PollEvent(&event) != 0 )
|
||||||
mgr->manageEvents(&event);
|
mgr->manageEvents(&event);
|
||||||
|
|
||||||
|
// Gestion de la gravite
|
||||||
|
if( !mgr->hit("mario", 0, 5) )
|
||||||
|
mario->move(0, 5);
|
||||||
|
|
||||||
|
if( mgr->hit("mystery-bloc", 0, 8) )
|
||||||
|
mb.stop();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mgr->manageFps(); // Gestion des FPS (speed)
|
mgr->manageFps(); // Gestion des FPS (speed)
|
||||||
|
@ -95,6 +117,14 @@ int main(int argc, char* argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* GESTION DE QUAND ON QUITTE LA FENETRE
|
/* GESTION DE QUAND ON QUITTE LA FENETRE
|
||||||
*
|
*
|
||||||
* @e<SDL_Event*> Pointeur sur l'evenement appelant
|
* @e<SDL_Event*> Pointeur sur l'evenement appelant
|
||||||
|
@ -108,67 +138,87 @@ void quitEventHandler(SDL_Event *e){
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* GESTION DE QUAND ON APPUIE SUR FLECHE BAS
|
/* GESTION DE QUAND ON APPUIE SUR FLECHE BAS
|
||||||
*
|
*
|
||||||
* @e<SDL_Event*> Pointeur sur l'evenement appelant
|
* @e<SDL_Event*> Pointeur sur l'evenement appelant
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void keydownEventHandler(SDL_Event *e){
|
void keydownEventHandler(SDL_Event *e){
|
||||||
|
|
||||||
|
switch( (*e).key.keysym.sym ){
|
||||||
|
case SDLK_UP:
|
||||||
|
up_move = true;
|
||||||
|
mario->moveUp(&up_move);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_LEFT:
|
||||||
|
left_move = true;
|
||||||
|
mario->moveLeft(&left_move);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
right_move = true;
|
||||||
|
mario->moveRight(&right_move);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDLK_DOWN:
|
||||||
|
down_move = true;
|
||||||
|
mario->moveDown(&down_move);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
cout << "UNUSED KEY" << endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* GESTION DE QUAND ON APPUIE SUR FLECHE BAS
|
||||||
|
*
|
||||||
|
* @e<SDL_Event*> Pointeur sur l'evenement appelant
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void keyupEventHandler(SDL_Event *e){
|
||||||
SDL_Rect *mRect = mario->viewport();
|
SDL_Rect *mRect = mario->viewport();
|
||||||
bool hasMoved = false;
|
|
||||||
int step = 20;
|
|
||||||
|
|
||||||
|
|
||||||
switch( (*e).key.keysym.sym ){
|
switch( (*e).key.keysym.sym ){
|
||||||
case SDLK_UP:
|
case SDLK_UP:
|
||||||
while( !hasMoved && step > 0 ){
|
up_move = false;
|
||||||
|
|
||||||
if( !mgr->hit("mario", 0, -step) ){
|
|
||||||
mario->move(0, -step);
|
|
||||||
hasMoved = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
step--;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SDLK_LEFT:
|
case SDLK_LEFT:
|
||||||
while( !hasMoved && step > 0 ){
|
left_move = false;
|
||||||
|
|
||||||
if( !mgr->hit("mario", -step, 0) ){
|
|
||||||
mario->move(-step, 0);
|
|
||||||
hasMoved = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
step--;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SDLK_RIGHT:
|
case SDLK_RIGHT:
|
||||||
while( !hasMoved && step > 0 ){
|
right_move = false;
|
||||||
|
|
||||||
if( !mgr->hit("mario", step, 0) ){
|
|
||||||
mario->move(step, 0);
|
|
||||||
hasMoved = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
step--;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SDLK_DOWN:
|
case SDLK_DOWN:
|
||||||
while( !hasMoved && step > 0 ){
|
down_move = false;
|
||||||
|
|
||||||
if( !mgr->hit("mario", 0, step) ){
|
|
||||||
mario->move(0, step);
|
|
||||||
hasMoved = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
step--;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -28,5 +28,6 @@
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
void quitEventHandler(SDL_Event *e);
|
void quitEventHandler(SDL_Event *e);
|
||||||
void keydownEventHandler(SDL_Event *e);
|
void keydownEventHandler(SDL_Event *e);
|
||||||
|
void keyupEventHandler(SDL_Event *e);
|
||||||
|
|
||||||
#endif
|
#endif
|
BIN
SDL#4/main.o
BIN
SDL#4/main.o
Binary file not shown.
|
@ -1,5 +1,7 @@
|
||||||
A FAIRE
|
A FAIRE
|
||||||
=======
|
=======
|
||||||
|
- [ ] 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 la gravite
|
- [ ] Gestion de la gravite
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,11 @@ xMarioMario::xMarioMario(xManager *m, int x, int y)
|
||||||
}
|
}
|
||||||
){
|
){
|
||||||
|
|
||||||
|
_left = NULL;
|
||||||
|
_right = NULL;
|
||||||
|
_up = NULL;
|
||||||
|
_down = NULL;
|
||||||
|
|
||||||
|
|
||||||
// this->addFrame( (SDL_Rect){2, 0, 19, 29} );
|
// this->addFrame( (SDL_Rect){2, 0, 19, 29} );
|
||||||
// this->addFrame( (SDL_Rect){33, 0, 19, 29} );
|
// this->addFrame( (SDL_Rect){33, 0, 19, 29} );
|
||||||
|
@ -34,4 +39,214 @@ xMarioMario::xMarioMario(xManager *m, int x, int y)
|
||||||
// this->addFrame( (SDL_Rect){82, 0, 18, 32} );
|
// this->addFrame( (SDL_Rect){82, 0, 18, 32} );
|
||||||
// this->addFrame( (SDL_Rect){103, 0, 18, 32} );
|
// this->addFrame( (SDL_Rect){103, 0, 18, 32} );
|
||||||
// this->addFrame( (SDL_Rect){125, 0, 18, 32} );
|
// this->addFrame( (SDL_Rect){125, 0, 18, 32} );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* [XLEFTMOVEPROCESS] Traitement async de mouvement
|
||||||
|
=========================================================*/
|
||||||
|
void xLeftMoveProcess(xMarioMario *m, bool *run){
|
||||||
|
bool hasMoved = false;
|
||||||
|
int step = 5;
|
||||||
|
|
||||||
|
|
||||||
|
while( *run ){
|
||||||
|
|
||||||
|
hasMoved = false;
|
||||||
|
step = 5;
|
||||||
|
|
||||||
|
// Tant qu'on a pas bouge et qu'on peut se deplacer
|
||||||
|
while( !hasMoved && step > 0 ){
|
||||||
|
|
||||||
|
// Si aucune collision, on deplace
|
||||||
|
if( !m->manager()->hit("mario", -step, 0) ){
|
||||||
|
m->move(-step, 0);
|
||||||
|
hasMoved = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// on reduit la distance de mouvement
|
||||||
|
step--;
|
||||||
|
}
|
||||||
|
|
||||||
|
usleep(10000);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* [MOVELEFT] Deplacement vers la gauche
|
||||||
|
=========================================================*/
|
||||||
|
void xMarioMario::moveLeft(bool *run){
|
||||||
|
if( _left != NULL ){
|
||||||
|
delete _left;
|
||||||
|
_left = NULL;
|
||||||
|
}
|
||||||
|
// On lance le thread
|
||||||
|
_left = new thread(xLeftMoveProcess, this, run);
|
||||||
|
_left->detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* [XRIGHTMOVEPROCESS] Traitement async de mouvement
|
||||||
|
=========================================================*/
|
||||||
|
void xRightMoveProcess(xMarioMario *m, bool *run){
|
||||||
|
bool hasMoved = false;
|
||||||
|
int step = 5;
|
||||||
|
|
||||||
|
|
||||||
|
while( *run ){
|
||||||
|
|
||||||
|
hasMoved = false;
|
||||||
|
step = 5;
|
||||||
|
|
||||||
|
// Tant qu'on a pas bouge et qu'on peut se deplacer
|
||||||
|
while( !hasMoved && step > 0 ){
|
||||||
|
|
||||||
|
// Si aucune collision, on deplace
|
||||||
|
if( !m->manager()->hit("mario", step, 0) ){
|
||||||
|
m->move(step, 0);
|
||||||
|
hasMoved = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// on reduit la distance de mouvement
|
||||||
|
step--;
|
||||||
|
}
|
||||||
|
|
||||||
|
usleep(10000);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* [MOVERIGHT] Deplacement vers la droite
|
||||||
|
=========================================================*/
|
||||||
|
void xMarioMario::moveRight(bool *run){
|
||||||
|
if( _right != NULL ){
|
||||||
|
delete _right;
|
||||||
|
_right = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On lance le thread
|
||||||
|
_right = new thread(xRightMoveProcess, this, run);
|
||||||
|
_right->detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* [XUPMOVEPROCESS] Traitement async de mouvement
|
||||||
|
=========================================================*/
|
||||||
|
void xUpMoveProcess(xMarioMario *m, bool *run){
|
||||||
|
bool hasMoved = false;
|
||||||
|
int step = 5;
|
||||||
|
|
||||||
|
|
||||||
|
while( *run ){
|
||||||
|
|
||||||
|
hasMoved = false;
|
||||||
|
step = 5;
|
||||||
|
|
||||||
|
// Tant qu'on a pas bouge et qu'on peut se deplacer
|
||||||
|
while( !hasMoved && step > 0 ){
|
||||||
|
|
||||||
|
// Si aucune collision, on deplace
|
||||||
|
if( !m->manager()->hit("mario", 0, -step) ){
|
||||||
|
m->move(0, -step);
|
||||||
|
hasMoved = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// on reduit la distance de mouvement
|
||||||
|
step--;
|
||||||
|
}
|
||||||
|
|
||||||
|
usleep(10000);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* [MOVEUP] Deplacement vers le haut
|
||||||
|
=========================================================*/
|
||||||
|
void xMarioMario::moveUp(bool *run){
|
||||||
|
if( _up != NULL ){
|
||||||
|
delete _up;
|
||||||
|
_up = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On lance le thread
|
||||||
|
_up = new thread(xUpMoveProcess, this, run);
|
||||||
|
_up->detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* [XDOWNMOVEPROCESS] Traitement async de mouvement
|
||||||
|
=========================================================*/
|
||||||
|
void xDownMoveProcess(xMarioMario *m, bool *run){
|
||||||
|
bool hasMoved = false;
|
||||||
|
int step = 5;
|
||||||
|
|
||||||
|
|
||||||
|
while( *run ){
|
||||||
|
|
||||||
|
hasMoved = false;
|
||||||
|
step = 5;
|
||||||
|
|
||||||
|
// Tant qu'on a pas bouge et qu'on peut se deplacer
|
||||||
|
while( !hasMoved && step > 0 ){
|
||||||
|
|
||||||
|
// Si aucune collision, on deplace
|
||||||
|
if( !m->manager()->hit("mario", 0, step) ){
|
||||||
|
m->move(0, step);
|
||||||
|
hasMoved = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// on reduit la distance de mouvement
|
||||||
|
step--;
|
||||||
|
}
|
||||||
|
|
||||||
|
usleep(10000);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* [MOVEDOWN] Deplacement vers le bas
|
||||||
|
=========================================================*/
|
||||||
|
void xMarioMario::moveDown(bool *run){
|
||||||
|
if( _down != NULL ){
|
||||||
|
delete _down;
|
||||||
|
_down = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On lance le thread
|
||||||
|
_down = new thread(xDownMoveProcess, this, run);
|
||||||
|
_down->detach();
|
||||||
}
|
}
|
|
@ -7,9 +7,28 @@
|
||||||
public:
|
public:
|
||||||
xMarioMario(xManager *manager, int x, int y); // Spritesheet avec taille de chaque sprite
|
xMarioMario(xManager *manager, int x, int y); // Spritesheet avec taille de chaque sprite
|
||||||
|
|
||||||
|
void moveLeft(bool *run); // Deplacement a gauche
|
||||||
|
void moveRight(bool *run); // Deplacement a droite
|
||||||
|
void moveUp(bool *run); // Deplacement en haut
|
||||||
|
void moveDown(bool *run); // Deplacement en bas
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Uint32 _lastmove;
|
Uint32 _lastmove;
|
||||||
float _acceleration;
|
float _acceleration;
|
||||||
|
|
||||||
|
// Gestion du deplacement
|
||||||
|
thread *_left;
|
||||||
|
thread *_right;
|
||||||
|
thread *_up;
|
||||||
|
thread *_down;
|
||||||
|
|
||||||
|
// Fontions du thread
|
||||||
|
friend void xLeftMoveProcess(xMarioMario *m, bool *run);
|
||||||
|
friend void xRightMoveProcess(xMarioMario *m, bool *run);
|
||||||
|
friend void xUpMoveProcess(xMarioMario *m, bool *run);
|
||||||
|
friend void xDownMoveProcess(xMarioMario *m, bool *run);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -104,7 +104,14 @@ bool xManager::hit(string current, int movex, int movey){
|
||||||
};
|
};
|
||||||
SDL_Rect c;
|
SDL_Rect c;
|
||||||
|
|
||||||
/* (2) On compare avec toutes les autres textures */
|
/* (2) On regarde si en dehors de la fenetre */
|
||||||
|
for( int y = r.y ; y < r.y+r.h ; y++ )
|
||||||
|
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 )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
|
||||||
|
/* (3) On compare avec toutes les autres textures */
|
||||||
for( int i = 0 ; i < _indexes.size() ; i++ ){
|
for( int i = 0 ; i < _indexes.size() ; i++ ){
|
||||||
|
|
||||||
// Si c'est pas le sprite courant
|
// Si c'est pas le sprite courant
|
||||||
|
@ -130,6 +137,60 @@ bool xManager::hit(string current, int movex, int movey){
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* [HIT] Retourne si une texture est en collision avec une autre
|
||||||
|
=========================================================*/
|
||||||
|
bool xManager::hit(SDL_Texture *current, int movex, int movey){
|
||||||
|
/* (1) On recupere le SDL_Rect destination du sprite courant */
|
||||||
|
int xIndex = -1;
|
||||||
|
for( int i = 0 ; i < _sprites.size() ; i++ )
|
||||||
|
if( _sprites[i] == current )
|
||||||
|
xIndex = i;
|
||||||
|
|
||||||
|
if( xIndex == -1 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
|
||||||
|
SDL_Rect r = (SDL_Rect){
|
||||||
|
(*_dst[xIndex]).x+movex,
|
||||||
|
(*_dst[xIndex]).y+movey,
|
||||||
|
(*_dst[xIndex]).w,
|
||||||
|
(*_dst[xIndex]).h
|
||||||
|
};
|
||||||
|
SDL_Rect c;
|
||||||
|
|
||||||
|
/* (2) On regarde si en dehors de la fenetre */
|
||||||
|
for( int y = r.y ; y < r.y+r.h ; y++ )
|
||||||
|
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 )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
|
||||||
|
/* (3) On compare avec toutes les autres textures */
|
||||||
|
for( int i = 0 ; i < _sprites.size() ; i++ ){
|
||||||
|
|
||||||
|
// Si c'est pas le sprite courant
|
||||||
|
if( _sprites[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
|
/* [GETTEXTURE] Renvoie la texture
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
|
@ -189,7 +250,7 @@ void xManager::push(string index, 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(string index, SDL_Texture *t){
|
void xManager::pull(string index){
|
||||||
// On bloque l'acces inter-thread
|
// On bloque l'acces inter-thread
|
||||||
_mutex.lock();
|
_mutex.lock();
|
||||||
|
|
||||||
|
@ -214,6 +275,33 @@ void xManager::pull(string index, SDL_Texture *t){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* [PULL] Retire une texture du rendu principal
|
||||||
|
=========================================================*/
|
||||||
|
void xManager::pull(SDL_Texture *t){
|
||||||
|
// On bloque l'acces inter-thread
|
||||||
|
_mutex.lock();
|
||||||
|
|
||||||
|
// On cherche l'indice de la texture
|
||||||
|
int xIndex = -1;
|
||||||
|
|
||||||
|
for( int i = 0 ; i < _sprites.size() ; i++ )
|
||||||
|
if( _sprites[i] == t ) xIndex = i;
|
||||||
|
|
||||||
|
// Si on a rien trouve
|
||||||
|
if( xIndex == -1 )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// On supprime la texture et ses dimensions
|
||||||
|
_indexes.erase( _indexes.begin() + xIndex );
|
||||||
|
_sprites.erase( _sprites.begin() + xIndex );
|
||||||
|
_src.erase( _src.begin() + xIndex );
|
||||||
|
_dst.erase( _dst.begin() + xIndex );
|
||||||
|
|
||||||
|
// On debloque l'acces
|
||||||
|
_mutex.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,12 +13,15 @@
|
||||||
bool setImage(const char *url);
|
bool setImage(const char *url);
|
||||||
|
|
||||||
bool hit(string current, int movex=0, int movey=0); // Gestion des collisions
|
bool hit(string current, int movex=0, int movey=0); // Gestion des collisions
|
||||||
|
bool hit(SDL_Texture *current, int movex=0, int movey=0); // Gestion des collisions
|
||||||
|
|
||||||
SDL_Texture *getTexture(string index);
|
SDL_Texture *getTexture(string index);
|
||||||
SDL_Rect *getSrc(string index);
|
SDL_Rect *getSrc(string index);
|
||||||
SDL_Rect *getDst(string index);
|
SDL_Rect *getDst(string index);
|
||||||
|
|
||||||
void push(string index, SDL_Texture *t, SDL_Rect *origin, SDL_Rect *dest);
|
void push(string index, SDL_Texture *t, SDL_Rect *origin, SDL_Rect *dest);
|
||||||
void pull(string index, SDL_Texture *t);
|
void pull(string index);
|
||||||
|
void pull(SDL_Texture *t);
|
||||||
|
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
|
|
|
@ -110,7 +110,13 @@ void xSprite::push(string index){
|
||||||
/* [PULL] Retire une sprite du rendu
|
/* [PULL] Retire une sprite du rendu
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
void xSprite::pull(string index){
|
void xSprite::pull(string index){
|
||||||
_manager->pull( index, _texture );
|
_manager->pull( index );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* [PULL] Retire une sprite du rendu
|
||||||
|
=========================================================*/
|
||||||
|
void xSprite::pull(){
|
||||||
|
_manager->pull( _texture );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* [UPDATE] Mise a jour du rendu
|
/* [UPDATE] Mise a jour du rendu
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
void push(string index); // Ajoute a l'affichage
|
void push(string index); // Ajoute a l'affichage
|
||||||
void pull(string index); // Retire de l'affichage
|
void pull(string index); // Retire de l'affichage
|
||||||
|
void pull(); // Retire de l'affichage
|
||||||
|
|
||||||
void update(); // Fait renmonter la mise a jour du manager
|
void update(); // Fait renmonter la mise a jour du manager
|
||||||
|
|
||||||
|
|
|
@ -47,25 +47,33 @@ 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){
|
||||||
if( newpos.x != 0 )
|
|
||||||
_viewport.x = newpos.x;
|
|
||||||
|
|
||||||
if( newpos.y != 0 )
|
if( !_manager->hit(_texture, newpos.x, newpos.y) ){
|
||||||
_viewport.y = newpos.y;
|
|
||||||
|
|
||||||
if( newpos.w != 0 )
|
if( newpos.x != 0 )
|
||||||
_viewport.w = newpos.w;
|
_viewport.x = newpos.x;
|
||||||
|
|
||||||
if( newpos.h != 0)
|
if( newpos.y != 0 )
|
||||||
_viewport.h = newpos.h;
|
_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
|
/* [MOVE] Deplacement de la position/taille du sprite
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
void xSpriteAnimation::move(int x, int y){
|
void xSpriteAnimation::move(int x, int y){
|
||||||
_viewport.x += x;
|
|
||||||
_viewport.y += y;
|
if( !_manager->hit(_texture, x, y) ){
|
||||||
|
_viewport.x += x;
|
||||||
|
_viewport.y += y;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -96,6 +104,41 @@ SDL_Rect *xSpriteAnimation::viewport(){ return &_viewport; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* [PUSH] Ajoute au rendu
|
||||||
|
=========================================================*/
|
||||||
|
void xSpriteAnimation::push(string index){
|
||||||
|
/* (1) On ajoute le sprite au rendu */
|
||||||
|
_manager->push(index, _texture, &_frame, &_viewport);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* [PULL] Retire du rendu
|
||||||
|
=========================================================*/
|
||||||
|
void xSpriteAnimation::pull(string index){
|
||||||
|
/* (2) On retire le sprite du rendu */
|
||||||
|
_manager->pull(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* [PULL] Retire du rendu
|
||||||
|
=========================================================*/
|
||||||
|
void xSpriteAnimation::pull(){
|
||||||
|
/* (2) On retire le sprite du rendu */
|
||||||
|
_manager->pull(_texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* [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){
|
||||||
|
@ -142,15 +185,12 @@ 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){
|
||||||
/* (1) On ajoute le sprite au rendu */
|
this->push(index);
|
||||||
_manager->push(index, _texture, &_frame, &_viewport);
|
|
||||||
|
|
||||||
/* (2) On lance l'animation */
|
/* (1) On lance l'animation */
|
||||||
_animation = new thread(xSpriteAnimationProcess, this, t, flags);
|
_animation = new thread(xSpriteAnimationProcess, this, t, flags);
|
||||||
|
|
||||||
// On attends pas le thread
|
// On attends pas le thread
|
||||||
|
@ -161,10 +201,9 @@ void xSpriteAnimation::start(string index, int t, int flags){
|
||||||
|
|
||||||
/* [STOP] Arrete l'animation
|
/* [STOP] Arrete l'animation
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
void xSpriteAnimation::stop(string index){
|
void xSpriteAnimation::stop(){
|
||||||
|
this->pull();
|
||||||
|
|
||||||
/* (1) On arrete l'animation */
|
/* (1) On arrete l'animation */
|
||||||
delete _animation;
|
delete _animation;
|
||||||
|
|
||||||
/* (2) On retire le sprite du rendu */
|
|
||||||
_manager->pull(index, _texture);
|
|
||||||
}
|
}
|
|
@ -18,9 +18,14 @@
|
||||||
xManager *manager();
|
xManager *manager();
|
||||||
SDL_Rect *viewport();
|
SDL_Rect *viewport();
|
||||||
|
|
||||||
|
// Gestion de l'ajout au rendu
|
||||||
|
void push(string index); // Ajout au rendu
|
||||||
|
void pull(string index); // Retrait du rendu
|
||||||
|
void pull(); // Retrait du rendu
|
||||||
|
|
||||||
// Gestion de l'animation
|
// Gestion de l'animation
|
||||||
void start(string index, int t, int flags=SPRITE_ANIM_ONCE);
|
void start(string index, int t, int flags=SPRITE_ANIM_ONCE);
|
||||||
void stop(string index);
|
void stop();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,13 @@ void xSpriteGroup::pull(string index){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* [PULL] Retire une sprite de la surface parents
|
||||||
|
=========================================================*/
|
||||||
|
void xSpriteGroup::pull(){
|
||||||
|
for( int i = 0 ; i < _sprites.size() ; i++ )
|
||||||
|
_sprites[i]->pull();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* [UPDATE] Mise a jour du rendu
|
/* [UPDATE] Mise a jour du rendu
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
void push(string index); // Ajoute les sprites a l'affichage
|
void push(string index); // Ajoute les sprites a l'affichage
|
||||||
void pull(string index); // Retire les sprites de l'affichage
|
void pull(string index); // Retire les sprites de l'affichage
|
||||||
|
void pull(); // 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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue