Estou tentando escrever o módulo gráfico do meu mecanismo. Ou seja, esta parte do código fornece apenas uma interface através da qual carregar imagens, fontes, etc. e desenhá-las na tela. Também é um invólucro para a biblioteca que estou usando (SDL neste caso).
Aqui estão as interfaces para os meus Image
, Font
e GraphicsRenderer
classes. Por favor, diga-me se estou seguindo o caminho certo.
Imagem
class Image
{
public:
Image();
Image(const Image& other);
Image(const char* file);
~Image();
bool load(const char* file);
void free();
bool isLoaded() const;
Image& operator=(const Image& other);
private:
friend class GraphicsRenderer;
void* data_;
};
Fonte
class Font
{
public:
Font();
Font(const Font& other);
Font(const char* file, int ptsize);
~Font();
void load(const char* file, int ptsize);
void free();
bool isLoaded() const;
Font& operator=(const Font& other);
private:
friend class GraphicsRenderer;
void* data_;
};
GrapphicsRenderer
class GraphicsRenderer
{
public:
static GraphicsRenderer* Instance();
void blitImage(const Image& img, int x, int y);
void blitText(const char* string, const Font& font, int x, int y);
void render();
protected:
GraphicsRenderer();
GraphicsRenderer(const GraphicsRenderer& other);
GraphicsRenderer& operator=(const GraphicsRenderer& other);
~GraphicsRenderer();
private:
void* screen_;
bool initialize();
void finalize();
};
Editar: algumas alterações no código e mais detalhes.
Por algumas das discussões aqui, decidi substituir meu uso void*
por algo assim:
class Image
{
private:
struct ImageData;
std::shared_ptr<ImageData> data_;
};
(Obviamente, farei o mesmo pela Font
turma.)
Também devo mencionar que essas não são minhas aulas finais e completas. Eu só mostro aqui a funcionalidade básica (carregamento e renderização). Em vez de me dizer que funcionalidade você acha que devo adicionar (rotação de imagens, inclinação, redimensionamento, etc.), concentre-se em revisar o que eu já tenho. Vou tentar defender minhas escolhas, ou mudar de abordagem, se não puder.