mirror of
https://github.com/nacabaro/nacapet.git
synced 2026-06-05 14:02:53 +00:00
169 lines
4.9 KiB
C++
169 lines
4.9 KiB
C++
#include "menu.h"
|
|
#include "draw/draw.h"
|
|
#include "display/display.h"
|
|
#include "defs/screen_defs.h"
|
|
#include "vpet/evolution/evolution.h"
|
|
#include "loop/loop.h"
|
|
|
|
struct SpriteData* checkerboardPattern;
|
|
|
|
void menu_createCheckerboard() {
|
|
const uint8_t SCALE = 6;
|
|
const uint8_t logicalW = 34;
|
|
const uint8_t logicalH = 1;
|
|
const uint16_t scaledW = logicalW * SCALE; // 204
|
|
const uint16_t scaledH = logicalH * SCALE; // 6
|
|
const uint32_t bufferSize = scaledW * scaledH;
|
|
|
|
checkerboardPattern = (SpriteData*) malloc(sizeof(SpriteData));
|
|
checkerboardPattern->spriteWidth = scaledW;
|
|
checkerboardPattern->spriteHeight = scaledH;
|
|
checkerboardPattern->spriteNumber = 1;
|
|
checkerboardPattern->spriteData = (uint16_t**) malloc(sizeof(uint16_t*));
|
|
checkerboardPattern->spriteData[0] = (uint16_t*) malloc(sizeof(uint16_t) * bufferSize);
|
|
|
|
uint16_t* buf = checkerboardPattern->spriteData[0];
|
|
|
|
for (uint16_t row = 0; row < scaledH; row++) {
|
|
for (uint8_t col = 0; col < logicalW; col++) {
|
|
uint16_t color = (col % 2 == 0) ? TFT_BLACK : TFT_TRANSPARENT;
|
|
uint16_t* dst = buf + row * scaledW + col * SCALE;
|
|
for (uint8_t dx = 0; dx < SCALE; dx++) {
|
|
dst[dx] = color;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void menu_freeCheckerboard() {
|
|
free(checkerboardPattern->spriteData[0]);
|
|
free(checkerboardPattern->spriteData);
|
|
free(checkerboardPattern);
|
|
|
|
}
|
|
|
|
// Don't worry, I hate this too
|
|
void menu_evolutionScreen(TFT_eSprite& bg, TFT_eSprite &sprite, struct SpriteData* mainCharacterSprites) {
|
|
menu_createCheckerboard();
|
|
TFT_eSprite checkerboard = TFT_eSprite(&tft);
|
|
|
|
bool checkerboardShift = false;
|
|
|
|
tft_clearBuffer(sprite, TFT_TRANSPARENT);
|
|
|
|
for (int i = 0; i < 5;) {
|
|
uint64_t currentTime = esp_timer_get_time();
|
|
|
|
if (currentTime - lastUpdateTime > 500000) {
|
|
tone(SPK_PIN, 4100, 50);
|
|
tone(SPK_PIN, 3500, 50);
|
|
|
|
draw_drawBackground(bg, 90, 90, 3);
|
|
draw_drawSprite(sprite, 72 + ((i % 2 == 0) * 6), 72, mainCharacterSprites, 6);
|
|
|
|
tft_drawBuffer();
|
|
|
|
i++;
|
|
lastUpdateTime = currentTime;
|
|
}
|
|
|
|
}
|
|
|
|
draw_drawBackground(bg, 90, 90, 3);
|
|
draw_drawSprite(sprite, 72, 72, mainCharacterSprites, 7);
|
|
|
|
tft_clearBuffer(sprite, TFT_TRANSPARENT);
|
|
|
|
for (int i = 0; i < 16;) {
|
|
uint64_t currentTime = esp_timer_get_time();
|
|
if (currentTime - lastUpdateTime > 100000) {
|
|
uint8_t startYPos = 72 + (i * 6);
|
|
|
|
tft_drawRectangle(18, startYPos, 204, 6, TFT_RED);
|
|
|
|
draw_drawSprite(checkerboard, 18, startYPos, checkerboardPattern, 0, checkerboardShift);
|
|
|
|
tft_drawBuffer();
|
|
|
|
checkerboardShift = !checkerboardShift;
|
|
|
|
i++;
|
|
lastUpdateTime = currentTime;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 16;) {
|
|
uint64_t currentTime = esp_timer_get_time();
|
|
if (currentTime - lastUpdateTime > 100000) {
|
|
uint8_t startYPos = 72 + (i * 6);
|
|
|
|
tft_drawRectangle(18, startYPos, 204, 6, TFT_BLACK);
|
|
|
|
tft_drawBuffer();
|
|
|
|
checkerboardShift = !checkerboardShift;
|
|
|
|
i++;
|
|
lastUpdateTime = currentTime;
|
|
}
|
|
}
|
|
|
|
change_onChangeComplete();
|
|
|
|
for (int i = 15; i >= 0;) {
|
|
uint64_t currentTime = esp_timer_get_time();
|
|
if (currentTime - lastUpdateTime > 100000) {
|
|
uint8_t startYPos = 72 + (i * 6);
|
|
|
|
tft_drawRectangle(18, startYPos, 204, 6, TFT_GREEN);
|
|
draw_drawSprite(checkerboard, 18, startYPos, checkerboardPattern, 0, checkerboardShift);
|
|
|
|
tft_drawBuffer();
|
|
|
|
checkerboardShift = !checkerboardShift;
|
|
|
|
i--;
|
|
lastUpdateTime = currentTime;
|
|
}
|
|
}
|
|
|
|
for (int i = 15; i >= 0;) {
|
|
uint64_t currentTime = esp_timer_get_time();
|
|
if (currentTime - lastUpdateTime > 100000) {
|
|
draw_drawBackground(bg, 90, 90, 3);
|
|
draw_drawSprite(sprite, 72, 72, mainCharacterSprites, 7);
|
|
|
|
uint8_t rectHeight = (6 * i);
|
|
|
|
tft_drawRectangle(18, 72, 204, rectHeight, TFT_GREEN);
|
|
|
|
for (int j = 0; j < i; j++) {
|
|
uint8_t rectYPos = 72 + (6 * j);
|
|
|
|
draw_drawSprite(checkerboard, 18, rectYPos, checkerboardPattern, 0, checkerboardShift);
|
|
|
|
checkerboardShift = !checkerboardShift;
|
|
}
|
|
|
|
tft_drawBuffer();
|
|
i--;
|
|
lastUpdateTime = currentTime;
|
|
}
|
|
}
|
|
|
|
tone(SPK_PIN, 2100, 100);
|
|
tone(SPK_PIN, 3500, 100);
|
|
tone(SPK_PIN, 4100, 100);
|
|
tone(SPK_PIN, 4650, 200);
|
|
|
|
|
|
lastPressedButtonTime = esp_timer_get_time();
|
|
|
|
menu_freeCheckerboard();
|
|
|
|
vTaskResume(secondLoop);
|
|
|
|
screenKey = MAIN_SCREEN;
|
|
|
|
lastUpdateTime = 0; // Un pequeño empujoncito
|
|
} |