Now with better graphics

This commit is contained in:
bdnugget 2025-05-23 14:13:41 +02:00
parent dbc6e8c548
commit 226b65cb70
2 changed files with 118 additions and 17 deletions

View File

@ -10,6 +10,22 @@
"cStandard": "c17", "cStandard": "c17",
"cppStandard": "c++17", "cppStandard": "c++17",
"intelliSenseMode": "linux-clang-x64" "intelliSenseMode": "linux-clang-x64"
},
{
"name": "Arduino",
"includePath": [
"${workspaceFolder}/**",
"/home/bd/.arduino15/packages/arduino/hardware/avr/1.8.6/libraries/Wire/src",
"/home/bd/Arduino/libraries/Adafruit_SSD1306",
"/home/bd/Arduino/libraries/Adafruit_GFX_Library",
"/home/bd/Arduino/libraries/Adafruit_BusIO",
"/home/bd/.arduino15/packages/arduino/hardware/avr/1.8.6/libraries/SPI/src"
],
"forcedInclude": [],
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/avr-gcc",
"cStandard": "c11",
"cppStandard": "c++17"
} }
], ],
"version": 4 "version": 4

View File

@ -34,30 +34,111 @@ const unsigned long updateInterval = 1000; // ms
void drawBars() { void drawBars() {
// Draw yellow background for status area // Draw yellow background for status area
display.fillRect(0, 0, SCREEN_WIDTH, YELLOW_BAR_HEIGHT, SSD1306_WHITE); display.fillRect(0, 0, SCREEN_WIDTH, YELLOW_BAR_HEIGHT, SSD1306_WHITE);
// Draw Food bar label (F) // Draw Food bar label
display.setTextColor(SSD1306_BLACK); display.setTextColor(SSD1306_BLACK);
display.setCursor(BAR_LABEL_X, FOOD_BAR_Y); display.setTextSize(1);
display.print("F"); display.setCursor(BAR_X, FOOD_BAR_Y);
// Draw Poop bar label (P) display.print("FOOD");
display.setCursor(BAR_LABEL_X, POOP_BAR_Y); // Draw Poop bar label
display.print("P"); display.setCursor(BAR_X, POOP_BAR_Y);
display.print("POOP");
// Draw Food bar // Draw Food bar
int foodBarLen = (food * BAR_WIDTH) / MAX_FOOD; int foodBarLen = (food * (BAR_WIDTH - 30)) / MAX_FOOD; // leave space for label
display.fillRect(BAR_X, FOOD_BAR_Y, foodBarLen, BAR_HEIGHT, SSD1306_BLACK); display.fillRect(BAR_X + 34, FOOD_BAR_Y, foodBarLen, BAR_HEIGHT, SSD1306_BLACK);
display.drawRect(BAR_X, FOOD_BAR_Y, BAR_WIDTH, BAR_HEIGHT, SSD1306_BLACK); display.drawRect(BAR_X + 34, FOOD_BAR_Y, BAR_WIDTH - 30, BAR_HEIGHT, SSD1306_BLACK);
// Draw Poop bar // Draw Poop bar
int poopBarLen = (poop * BAR_WIDTH) / MAX_POOP; int poopBarLen = (poop * (BAR_WIDTH - 30)) / MAX_POOP;
display.fillRect(BAR_X, POOP_BAR_Y, poopBarLen, BAR_HEIGHT, SSD1306_BLACK); display.fillRect(BAR_X + 34, POOP_BAR_Y, poopBarLen, BAR_HEIGHT, SSD1306_BLACK);
display.drawRect(BAR_X, POOP_BAR_Y, BAR_WIDTH, BAR_HEIGHT, SSD1306_BLACK); display.drawRect(BAR_X + 34, POOP_BAR_Y, BAR_WIDTH - 30, BAR_HEIGHT, SSD1306_BLACK);
display.setTextSize(1);
}
void drawStickFigure(int frame) {
// Draw a simple stick figure in the blue area (below yellow bar)
int baseY = 24;
int centerX = SCREEN_WIDTH / 2;
// Head
display.drawCircle(centerX, baseY, 6, SSD1306_WHITE);
// Body
display.drawLine(centerX, baseY + 6, centerX, baseY + 24, SSD1306_WHITE);
// Arms (simple animation)
if (frame % 2 == 0) {
display.drawLine(centerX, baseY + 10, centerX - 10, baseY + 18, SSD1306_WHITE);
display.drawLine(centerX, baseY + 10, centerX + 10, baseY + 18, SSD1306_WHITE);
} else {
display.drawLine(centerX, baseY + 10, centerX - 14, baseY + 14, SSD1306_WHITE);
display.drawLine(centerX, baseY + 10, centerX + 14, baseY + 14, SSD1306_WHITE);
}
// Legs
display.drawLine(centerX, baseY + 24, centerX - 10, baseY + 40, SSD1306_WHITE);
display.drawLine(centerX, baseY + 24, centerX + 10, baseY + 40, SSD1306_WHITE);
}
void drawStinkyPoop() {
// Draw a simple stinky poop in the blue area
int baseY = 32;
int centerX = SCREEN_WIDTH / 2;
// Poop base
display.fillCircle(centerX, baseY + 16, 8, SSD1306_WHITE);
display.fillCircle(centerX, baseY + 8, 6, SSD1306_WHITE);
display.fillCircle(centerX, baseY, 4, SSD1306_WHITE);
// Stink lines
display.drawLine(centerX - 6, baseY - 4, centerX - 6, baseY - 12, SSD1306_WHITE);
display.drawLine(centerX, baseY - 6, centerX, baseY - 16, SSD1306_WHITE);
display.drawLine(centerX + 6, baseY - 4, centerX + 6, baseY - 12, SSD1306_WHITE);
} }
void drawGameOver(const char* message) { void drawGameOver(const char* message) {
display.clearDisplay(); display.clearDisplay();
display.setTextColor(SSD1306_WHITE); // Draw yellow status bar with game over message
display.setCursor(0, 24); display.fillRect(0, 0, SCREEN_WIDTH, YELLOW_BAR_HEIGHT, SSD1306_WHITE);
display.setTextColor(SSD1306_BLACK);
display.setTextSize(1); display.setTextSize(1);
display.println("GAME OVER!"); display.setCursor(2, 0);
display.println(message); display.print("GAME OVER!");
display.setCursor(2, 8);
display.print(message);
// Draw relevant icon in blue area
if (strcmp(message, "Poop explosion!") == 0) {
drawStinkyPoop();
} else if (strcmp(message, "Starved!") == 0) {
// Draw a sad stick figure
int baseY = 32;
int centerX = SCREEN_WIDTH / 2;
display.drawCircle(centerX, baseY, 6, SSD1306_WHITE);
display.drawLine(centerX, baseY + 6, centerX, baseY + 24, SSD1306_WHITE);
display.drawLine(centerX, baseY + 10, centerX - 10, baseY + 18, SSD1306_WHITE);
display.drawLine(centerX, baseY + 10, centerX + 10, baseY + 18, SSD1306_WHITE);
display.drawLine(centerX, baseY + 24, centerX - 10, baseY + 40, SSD1306_WHITE);
display.drawLine(centerX, baseY + 24, centerX + 10, baseY + 40, SSD1306_WHITE);
// Sad mouth (simple frown)
display.drawLine(centerX - 3, baseY + 6, centerX + 3, baseY + 6, SSD1306_WHITE);
} else if (strcmp(message, "Overate! Exploded!") == 0) {
// Draw a stick figure with a big belly
int baseY = 32;
int centerX = SCREEN_WIDTH / 2;
display.drawCircle(centerX, baseY, 6, SSD1306_WHITE);
display.drawLine(centerX, baseY + 6, centerX, baseY + 24, SSD1306_WHITE);
display.drawLine(centerX, baseY + 10, centerX - 10, baseY + 18, SSD1306_WHITE);
display.drawLine(centerX, baseY + 10, centerX + 10, baseY + 18, SSD1306_WHITE);
display.drawLine(centerX, baseY + 24, centerX - 10, baseY + 40, SSD1306_WHITE);
display.drawLine(centerX, baseY + 24, centerX + 10, baseY + 40, SSD1306_WHITE);
// Big belly
display.drawCircle(centerX, baseY + 18, 8, SSD1306_WHITE);
} else if (strcmp(message, "Constipation!") == 0) {
// Draw a stick figure with a pained face
int baseY = 32;
int centerX = SCREEN_WIDTH / 2;
display.drawCircle(centerX, baseY, 6, SSD1306_WHITE);
display.drawLine(centerX, baseY + 6, centerX, baseY + 24, SSD1306_WHITE);
display.drawLine(centerX, baseY + 10, centerX - 10, baseY + 18, SSD1306_WHITE);
display.drawLine(centerX, baseY + 10, centerX + 10, baseY + 18, SSD1306_WHITE);
display.drawLine(centerX, baseY + 24, centerX - 10, baseY + 40, SSD1306_WHITE);
display.drawLine(centerX, baseY + 24, centerX + 10, baseY + 40, SSD1306_WHITE);
// Pained mouth (zigzag)
display.drawLine(centerX - 2, baseY + 5, centerX, baseY + 7, SSD1306_WHITE);
display.drawLine(centerX, baseY + 7, centerX + 2, baseY + 5, SSD1306_WHITE);
}
display.display(); display.display();
} }
@ -130,6 +211,10 @@ void loop() {
// Redraw bars // Redraw bars
display.clearDisplay(); display.clearDisplay();
drawBars(); drawBars();
// Animate stick figure in blue area
static int frame = 0;
drawStickFigure(frame);
frame = (frame + 1) % 2;
display.display(); display.display();
delay(50); delay(100);
} }