PocketEmpires/Gfx.cpp

237 lines
4.8 KiB
C++

/* *************************************
* Includes
* *************************************/
#include "Gfx.h"
/* *************************************
* Defines
* *************************************/
/* *************************************
* Structs and enums
* *************************************/
/* *************************************
* Local variables
* *************************************/
static bool GfxIsInsideScreenArea(int8_t x, int8_t y, uint8_t w, uint8_t h);
void GfxInit(void)
{
gb.display.persistence = false; // Clears screen automatically
gb.display.setFont(font3x5);
}
void GfxDrawSprite(TYPE_SPRITE * ptrSprite)
{
if (GfxIsSpriteInsideScreenArea(ptrSprite) == true)
{
int8_t orig_color = gb.display.getColor();
gb.display.setColor(ptrSprite->color, GFX_WHITE);
gb.display.drawBitmap( ptrSprite->x,
ptrSprite->y,
ptrSprite->Data,
ptrSprite->rotation,
ptrSprite->flip );
gb.display.setColor(orig_color);
}
}
bool GfxRefreshNeeded(void)
{
return gb.update();
}
void GfxShowKeyboard(char* str, uint8_t length)
{
gb.keyboard(str, length);
}
void GfxClearScreen(void)
{
//gb.display.fillScreen(GFX_WHITE);
gb.display.clear();
}
bool GfxIsInsideScreenArea(int8_t x, int8_t y, uint8_t w, uint8_t h)
{
/*char strBuffer[16];
snprintf(strBuffer, 16, "%d", (int)(x + w));
GfxPrintText(strBuffer,48,8);
snprintf(strBuffer, 16, "x = %d", (int)(x));
GfxPrintText(strBuffer,48,16);
snprintf(strBuffer, 16, "w = %d", (int)(w));
GfxPrintText(strBuffer,48,24);*/
if ( ( (x + w) >= 0)
&&
(x < X_SCREEN_RESOLUTION)
&&
( (y + h) >= 0)
&&
(y < Y_SCREEN_RESOLUTION) )
{
return true;
}
return false;
}
bool GfxIsSpriteInsideScreenArea(TYPE_SPRITE * spr)
{
return GfxIsInsideScreenArea(spr->x, spr->y, spr->w, spr->h);
}
uint8_t GfxGetWidthFromSpriteData(const uint8_t* sprData)
{
// On Gamebuino bitmaps, width is always stored on first byte.
return pgm_read_byte_near(&sprData[0]);
}
uint8_t GfxGetHeightFromSpriteData(const uint8_t* sprData)
{
// On Gamebuino bitmaps, height is always stored on second byte.
return pgm_read_byte_near(&sprData[1]);
}
void GfxPrintText_Flash(const __FlashStringHelper * str)
{
gb.popup(str, 20 * 3 /* 3 seconds */);
}
void GfxPrintTextFont(const char* str, const uint8_t* font, uint8_t x, uint8_t y)
{
uint8_t* orig_font = gb.display.getFont();
gb.display.cursorX = x;
gb.display.cursorY = y;
gb.display.setFont(font);
gb.display.setColor(GFX_BLACK, GFX_WHITE);
gb.display.print(str);
if (orig_font != NULL)
{
gb.display.setFont(orig_font);
}
}
void GfxRenderTiles(TYPE_CAMERA* ptrCamera)
{
gb.display.setColor(GFX_GRAY);
if (ptrCamera == NULL)
{
return;
}
for (int i = 0; i < Y_SCREEN_RESOLUTION; i+=8)
{
for (int j = 0; j < X_SCREEN_RESOLUTION; j++)
{
//if (j & 1)
//{
int x = j + ptrCamera->X_Offset;
int y = i + ptrCamera->Y_Offset;
if ((x >= 0) && (y >= 0))
{
gb.display.drawPixel(j + ptrCamera->X_Offset, i + ptrCamera->Y_Offset);
}
//}
}
}
for (int i = 0; i < X_SCREEN_RESOLUTION; i+=8)
{
for (int j = 0; j < Y_SCREEN_RESOLUTION; j++)
{
//if (j & 1)
//{
int x = j + ptrCamera->X_Offset;
int y = i + ptrCamera->Y_Offset;
if ((x >= 0) && (y >= 0))
{
gb.display.drawPixel(i + ptrCamera->X_Offset, j + ptrCamera->Y_Offset);
}
//}
}
}
}
void GfxPrintText(const char* str, uint8_t x, uint8_t y)
{
GfxPrintTextFont(str, font3x5, x, y);
}
void GfxDrawCircle(uint16_t x, uint16_t y, uint8_t radius, int8_t color)
{
if (GfxIsInsideScreenArea(x, y, radius, radius) == true)
{
int8_t orig_color = gb.display.getColor();
gb.display.setColor(color);
gb.display.drawCircle(x, y, radius);
gb.display.setColor(orig_color);
}
}
void GfxDrawRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color)
{
if (GfxIsInsideScreenArea(x, y, w, h) == true)
{
int8_t orig_color = gb.display.getColor();
gb.display.setColor(color);
gb.display.drawRect(x, y, w, h);
gb.display.setColor(orig_color);
}
}
void GfxDrawLine(uint8_t x0, uint8_t x1, uint8_t y0, uint8_t y1, uint8_t color)
{
gb.display.setColor(color);
gb.display.drawLine(x0, y0, x1, y1);
}
void GfxFillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color)
{
if (GfxIsInsideScreenArea(x, y, w, h) == true)
{
int8_t orig_color = gb.display.getColor();
gb.display.setColor(color);
gb.display.fillRect(x, y, w, h);
gb.display.setColor(orig_color);
}
}
void GfxShowResources(TYPE_RESOURCES* ptrResources)
{
char str[8];
gb.display.setColor(GFX_WHITE);
gb.display.fillRect(0, 0, X_SCREEN_RESOLUTION, 5);
snprintf(str, 8, "W=%d", ptrResources->Wood);
GfxPrintTextFont(str, font3x3, 4, 1);
snprintf(str, 8, "G=%d", ptrResources->Gold);
GfxPrintTextFont(str, font3x3, 24, 1);
snprintf(str, 8, "F=%d", ptrResources->Food);
GfxPrintTextFont(str, font3x3, 48, 1);
}