lab.cpp/SDL#4/xSDL/xSprite.cpp

220 lines
5.0 KiB
C++

/* [DESTRUCTOR] Destruction de la surface
=========================================================*/
xSprite::~xSprite(){
SDL_DestroyTexture( _texture );
_manager = NULL;
_manager = NULL;
}
/* [CONSTRUCTOR] Construction de la surface vide
=========================================================*/
xSprite::xSprite(xManager *m){
_manager = m;
SDL_DestroyTexture(_texture);
_texture = NULL;
}
/* [CONSTRUCTOR] Construction de la surface avec couleur
=========================================================*/
xSprite::xSprite(xManager *m, const int rgb[]){
_manager = m;
_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;
}
/* [CONSTRUCTOR] Construction de la surface avec image
=========================================================*/
xSprite::xSprite(xManager *m, const char *url){
_manager = m;
_texture = NULL;
/* (1) On cree la texture directement */
_texture = IMG_LoadTexture(_manager->renderer(), url);
// Gestion erreur
if( _texture == NULL )
return;
}
/* [CONSTRUCTOR] Constructions avec copie de texture
=========================================================*/
xSprite::xSprite(xManager *m, SDL_Texture *t){
_manager = m;
_texture = t;
// Gestion erreur
if( _texture == NULL )
return;
}
/* [MOVE] Modification de la position/taille du sprite
=========================================================*/
void xSprite::move(SDL_Rect newpos){
if( !_manager->hit(_texture, newpos.x, newpos.y) ){
if( newpos.x != 0 )
_dst.x = newpos.x;
if( newpos.y != 0 )
_dst.y = newpos.y;
if( newpos.w != 0 )
_dst.w = newpos.w;
if( newpos.h != 0)
_dst.h = newpos.h;
}
}
/* [MOVE] Deplacement de la position/taille du sprite
=========================================================*/
void xSprite::move(int x, int y){
/* (1) Variables utiles */
int incrx = x;
int incry = y;
bool moveY = true;
int signofx = (x==0) ? 0 : x / abs(x);
int signofy = (y==0) ? 0 : y / abs(y);
/* (2) Tant qu'on n'a pas bouge */
while( incrx != 0 || incry != 0 ){
/* (3) Si on peut aller a la destination */
if( !_manager->hit(_texture, incrx, incry) ){
_dst.x += incrx;
_dst.y += incry;
return;
}
// cout << "NO" << endl;
/* (4) Sinon, on decremente les deplacements alternativement */
if( moveY )
incry -= signofy;
else
incrx -= signofx;
moveY = !moveY;
}
// Mise a jour si on a bouge
// if( incrx != 0 && incry != 0 )
_manager->update();
}
/* [DIMENSIONS] Definition des dimensions par defaut
=========================================================*/
void xSprite::dimensions(){
/* (1) On recupere les informations de la texture */
int w, h;
SDL_QueryTexture(_texture, NULL, NULL, &w, &h);
/* (2) On definit les dimensions par defaut */
_dst = (SDL_Rect){0, 0, w, h};
_src = (SDL_Rect){0, 0, w, h};
}
/* [DIMENSIONS] Definition des dimensions de la texture
=========================================================*/
void xSprite::dimensions(SDL_Rect r){
/* (1) On recupere les informations de la texture */
int w, h;
SDL_QueryTexture(_texture, NULL, NULL, &w, &h);
/* (2) On definit les dimensions */
_dst = (SDL_Rect){r.x, r.y, r.w, r.h};
_src = (SDL_Rect){0, 0, w, h};
}
/* [DIMENSIONS] Definition des dimensions de la texture+clip
=========================================================*/
void xSprite::dimensions(SDL_Rect r, SDL_Rect clip){
/* (1) On definit les dimensions */
_dst = (SDL_Rect){r.x, r.y, r.w, r.h};
_src = (SDL_Rect){clip.x, clip.y, clip.w, clip.h};
}
/* [PUSH] Ajoute le xSprite au rendu
=========================================================*/
void xSprite::push(string index){
_index = index;
_manager->push(index, _texture, &_src, &_dst);
}
/* [PULL] Retire une sprite du rendu
=========================================================*/
void xSprite::pull(string index){
_index = index;
_manager->pull( index );
}
/* [PULL] Retire une sprite du rendu
=========================================================*/
void xSprite::pull(){
_manager->pull( _texture );
}
/* [UPDATE] Mise a jour du rendu
=========================================================*/
void xSprite::update(){
_manager->update();
}
/* [TEXTURE] Retourne la texture
=========================================================*/
SDL_Texture *xSprite::texture(){ return _texture; }
/* [MANAGER] Retourne le manager
=========================================================*/
xManager *xSprite::manager(){ return _manager; }
/* [DST] Retourne le SDL_Rect de destination
=========================================================*/
SDL_Rect *xSprite::dst(){ return &_dst; }
/* [SRC] Retourne le SDL_Rect source
=========================================================*/
SDL_Rect *xSprite::src(){ return &_src; }