So you know some basic SDL but want to do something actually productive? Sprite sheets are awesome! Let's make some.
Code!namespace Video
{
class Sprite
{
private:
SDL_Texture* texture;
SDL_Rect rect;
public:
SDL_Texture* getTexture() const { return texture; }
SDL_Rect getRect() const { return rect; }
Sprite(SDL_Texture* texture, SDL_Rect rect) :
texture(texture),
rect(rect)
{
}
};
class SpriteSheet
{
private:
std::shared_ptr<SDL_Texture> texture;
int sprite_w;
int sprite_h;
public:
Sprite getSprite(const int number)
{
int texture_w;
int texture_h;
SDL_QueryTexture(texture.get(), nullptr, nullptr, &texture_w, &texture_h);
SDL_Rect rect;
rect.w = sprite_w;
rect.h = sprite_h;
rect.x = sprite_w * number;
rect.y = 0;
while (rect.x + sprite_w > texture_w)
{
rect.y += sprite_h;
rect.x -= texture_w;
}
rect.y = rect.y % texture_h;
return Sprite(texture.get(), rect);
}
SpriteSheet(SDL_Renderer* renderer, SDL_Surface* surface, const int sprite_w, const int sprite_h) :
sprite_w(sprite_w),
sprite_h(sprite_h)
{
texture = std::shared_ptr<SDL_Texture>(SDL_CreateTextureFromSurface(renderer, surface), SDL_DestroyTexture);
if (texture.get() == nullptr)
{
throw(std::exception(SDL_GetError()));
}
}
};
}