#include "xSprite.h" /** clean SDL objects */ xSprite::~xSprite(){ _mutex.lock(); SDL_FreeSurface( _surface ); _mutex.unlock(); } /** color sprite */ xSprite::xSprite(const int rgba[]){ this->setSurface(rgba); } /** image sprite */ xSprite::xSprite(const char *url){ this->setSurface(url); } /** image sprite with clip */ xSprite::xSprite(const char *url, SDL_Rect clip){ this->setSurface(url); this->setClip(clip); } /** update sprite to rhb color */ void xSprite::setSurface(const int rgba[]){ _mutex.lock(); if( _surface != NULL ){ SDL_FreeSurface( _surface ); _surface = NULL; } _surface = SDL_CreateRGBSurface(0, 0, 0, 32, rgba[0], rgba[1], rgba[2], rgba[3]); if( _surface == NULL ) { throw runtime_error("[xSprite] setSurface(rgba) -> NULL surface"); } _mutex.unlock(); } /** update sprite to image */ void xSprite::setSurface(const char *url){ _mutex.lock(); if( _surface != NULL ){ SDL_FreeSurface( _surface ); _surface = NULL; } _surface = IMG_Load(url); if( _surface == NULL ) { throw runtime_error("[xSprite] setSurface(url) -> NULL surface"); } _mutex.unlock(); } /** copies an existing surface */ void xSprite::setSurface(SDL_Surface *s){ _mutex.lock(); if( _surface != NULL ){ SDL_FreeSurface( _surface ); _surface = NULL; } _surface = s; if( _surface == NULL ) { throw runtime_error("[xSprite] setSurface(surface) -> NULL surface"); } _mutex.unlock(); } /** set sprite clip */ void xSprite::setClip(SDL_Rect clip){ _mutex.lock(); _clip = clip; _mutex.unlock(); } /** set sprite projection */ void xSprite::project(SDL_Rect dest){ _mutex.lock(); _projection = dest; _mutex.unlock(); } /** draws to renderer */ void xSprite::draw(SDL_Renderer* renderer){ _mutex.lock(); SDL_RenderCopy( renderer, SDL_CreateTextureFromSurface(renderer, _surface), &_clip, &_projection ); _mutex.unlock(); }