nacapet/src/draw/draw_sprites.cpp
Nacho e138334e06 Na, poca cosa
- Soporte para varios bichos  a la vez
- Algunos bugs menos
2025-06-01 01:54:36 +02:00

114 lines
3.2 KiB
C++

#include "draw.h"
#include "defs/sprite_data.h"
#include "defs/screen_defs.h"
#define BUFFER_X 240
#define BUFFER_Y 240
const char* TAG_D = "[DRAW]";
/*void draw_drawSprite(
TFT_eSprite &spr, int x, int y,
struct SpriteData* spriteData, uint8_t spriteNumber, uint8_t factor, bool flipHorizontal
) {
int scaledWidth = spriteData->spriteWidth * factor;
int scaledHeight = spriteData->spriteHeight * factor;
spr.createSprite(scaledWidth, scaledHeight);
for (int sy = 0; sy < scaledHeight; sy++) {
for (int sx = 0; sx < scaledWidth; sx++) {
int srcX = sx / factor;
if (flipHorizontal) {
srcX = (spriteData->spriteWidth - 1) - srcX;
}
int srcY = sy / factor;
uint16_t color = spriteData->spriteData
[spriteNumber]
[srcY * spriteData->spriteWidth + srcX];
spr.drawPixel(sx, sy, color);
}
}
spr.pushToSprite(&composite1, x, y, TFT_TRANSPARENT);
spr.pushToSprite(&composite2, x, y - 120, TFT_TRANSPARENT);
spriteData->lastX = x;
spriteData->lastY = y;
spriteData->lastW = scaledWidth;
spriteData->lastH = scaledWidth;
//printf("%s: Sprite %d drawn at (%d, %d) %s\n", TAG_D, spriteNumber, x, y, (flipHorizontal ? "flipped" : ""));
}*/
void draw_drawSprite(
TFT_eSprite &spr,
int x, int y,
struct SpriteData* spriteData,
uint8_t spriteNumber,
uint8_t factor,
bool flipHorizontal
) {
int srcW = spriteData->spriteWidth;
int srcH = spriteData->spriteHeight;
int scaledW = srcW * factor;
int scaledH = srcH * factor;
if (spr.width() != scaledW || spr.height() != scaledH) {
spr.deleteSprite();
spr.createSprite(scaledW, scaledH);
}
uint16_t *sprBuf = (uint16_t *)spr.getPointer();
uint16_t *srcBuf = spriteData->spriteData[spriteNumber];
for (int srcY = 0; srcY < srcH; srcY++) {
int destYBase = srcY * factor;
for (int srcX = 0; srcX < srcW; srcX++) {
int useX = flipHorizontal ? (srcW - 1 - srcX) : srcX;
uint16_t raw = srcBuf[srcY * srcW + useX];
uint16_t color = (raw << 8) | (raw >> 8);
int destXBase = srcX * factor;
for (int dy = 0; dy < factor; dy++) {
int rowStart = (destYBase + dy) * scaledW + destXBase;
for (int dx = 0; dx < factor; dx++) {
sprBuf[rowStart + dx] = color;
}
}
}
}
spr.pushToSprite(&composite1, x, y, TFT_TRANSPARENT);
spr.pushToSprite(&composite2, x, y - 120, TFT_TRANSPARENT);
spriteData->lastX = x;
spriteData->lastY = y;
spriteData->lastW = scaledW;
spriteData->lastH = scaledH;
}
void draw_drawSpriteCentered(
TFT_eSprite &spr,
struct SpriteData* spriteData, uint8_t spriteNumber, uint8_t factor, bool flipped, int y
) {
int x = (BUFFER_X - (spriteData->spriteWidth * factor)) / 2;
int new_y;
if (y == -1) {
new_y = (BUFFER_Y - (spriteData->spriteHeight * factor)) / 2;
} else {
new_y = y;
}
draw_drawSprite(
spr, x, new_y,
spriteData, spriteNumber, factor, flipped
);
}