237 lines
4.8 KiB
C++
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);
|
|
}
|