1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
#ifndef texture_h
#define texture_h
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <string>
#include <vector>
#include <SDL2/SDL_ttf.h>
#include <iostream>
class Texture{
public:
Texture ();
Texture ( std::string path, SDL_Renderer* gRenderer );
~Texture();
bool loadFromFile( std::string path, SDL_Renderer* gRenderer );
void free();
void render( const SDL_Point* p, SDL_Rect* clip , SDL_Renderer* gRenderer );
void render( SDL_Rect* r, SDL_Rect* clip , SDL_Renderer* gRenderer );
int getWidth();
int getHeight();
SDL_Texture* get_texture();
void set_texture(SDL_Texture* texture, unsigned int w, unsigned int h);
static void free_all();
static std::string resources_path;
private:
SDL_Texture* mTexture;
int mWidth;
int mHeight;
static std::vector <Texture*> textures;
};
// ========================= ! THIS PART is making me trouble. I want this header to DO something, not only declare things.
std::string Texture::resources_path;
Texture::Texture () : mTexture(NULL), mWidth(0), mHeight(0)
{
textures.push_back(this);
}
// !!! path load before renderer init ==> problems !!!
Texture::Texture ( std::string path, SDL_Renderer* gRenderer ): mTexture(NULL), mWidth(0), mHeight(0)
{
textures.push_back(this);
loadFromFile(path,gRenderer);
}
Texture::~Texture(){free();}
bool Texture::loadFromFile( std::string path, SDL_Renderer* gRenderer )
{
free();
#ifdef DEBUG
printf ("loading texture : %s%s\n", resources_path.c_str(), path.c_str());
#endif // DEBUG
SDL_Texture* newTexture = NULL;
SDL_Surface* loadedSurface = IMG_Load( ( resources_path+path ).c_str() );
if( loadedSurface == NULL )
{
printf( "Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError() );
}
else
{
// makes transparent pixel at this* color *this
// SDL_SetColorKey( loadedSurface, SDL_TRUE, SDL_MapRGB( loadedSurface->format, 0, 0xFF, 0xFF ) );
newTexture = SDL_CreateTextureFromSurface( gRenderer, loadedSurface );
if( newTexture == NULL )
{
printf( "Unable to create texture from %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
}
else
{
mWidth = loadedSurface->w;
mHeight = loadedSurface->h;
}
SDL_FreeSurface( loadedSurface );
}
mTexture = newTexture;
return mTexture != NULL;
}
void Texture::free()
{
//Free texture if it exists
if( mTexture != NULL )
{
SDL_DestroyTexture( mTexture );
mTexture = NULL;
mWidth = 0;
mHeight = 0;
}
}
void Texture::render( const SDL_Point* p, SDL_Rect* clip, SDL_Renderer* gRenderer )
{
SDL_Rect renderQuad = { p->x, p->y, mWidth, mHeight };
//Set clip rendering dimensions
if( clip != NULL )
{
renderQuad.w = clip->w;
renderQuad.h = clip->h;
}
//Render to screen
SDL_RenderCopy( gRenderer, mTexture, clip, &renderQuad );
}
void Texture::render( SDL_Rect* r, SDL_Rect* clip, SDL_Renderer* gRenderer )
{
SDL_Rect renderQuad = { r->x, r->y, r->w, r->h };
//Set clip rendering dimensions
if( clip != NULL )
{
renderQuad.w = clip->w;
renderQuad.h = clip->h;
}
//Render to screen
SDL_RenderCopy( gRenderer, mTexture, clip, &renderQuad );
}
int Texture::getWidth() {return mWidth;}
int Texture::getHeight() {return mHeight;}
void Texture::set_texture( SDL_Texture* tex, unsigned int w, unsigned int h)
{
mTexture = tex;
mWidth = w;
mHeight = h;
}
SDL_Texture* Texture::get_texture(){return mTexture;}
void Texture::free_all()
{
for (unsigned int i=0;i<textures.size();i++)
{
delete textures[i];
}
textures.clear();
}
std::vector <Texture*> Texture::textures;
// ========================= ! end THIS PART
#endif // texture_h
| |