feat(game+display): render animation
This commit is contained in:
@@ -8,6 +8,8 @@
|
|||||||
#define LCD_ROWS 4
|
#define LCD_ROWS 4
|
||||||
|
|
||||||
#define ACTION_INTERVAL 60000 // 1 minute
|
#define ACTION_INTERVAL 60000 // 1 minute
|
||||||
|
|
||||||
#define MAXIMUM_STAT 100
|
#define MAXIMUM_STAT 100
|
||||||
|
#define ANIMATION_FRAME_INTERVAL 1500 // Time in milliseconds between animation frames
|
||||||
|
|
||||||
#define DEBOUNCE_DELAY 50 // Debounce delay in milliseconds for the joystick button
|
#define DEBOUNCE_DELAY 50 // Debounce delay in milliseconds for the joystick button
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class Display {
|
|||||||
|
|
||||||
void begin();
|
void begin();
|
||||||
void clear();
|
void clear();
|
||||||
|
void drawPetStats(Pet& pet);
|
||||||
void drawPet(Pet& pet);
|
void drawPet(Pet& pet);
|
||||||
void drawBuffer(String buffer[]);
|
void drawBuffer(String buffer[]);
|
||||||
void drawMenu(Menu& menu);
|
void drawMenu(Menu& menu);
|
||||||
|
|||||||
+2
-1
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#define MAXIMUM_STAT 100
|
#include "constants.hpp"
|
||||||
|
|
||||||
class Pet {
|
class Pet {
|
||||||
public:
|
public:
|
||||||
@@ -27,4 +27,5 @@ class Pet {
|
|||||||
String reasonForDeath;
|
String reasonForDeath;
|
||||||
|
|
||||||
byte lastAnimationFrame;
|
byte lastAnimationFrame;
|
||||||
|
uint64_t lastAnimationFrameTime;
|
||||||
};
|
};
|
||||||
|
|||||||
+3
-1
@@ -45,7 +45,7 @@ void Display::drawBuffer(String buffer[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Display::drawPet(Pet &pet) {
|
void Display::drawPetStats(Pet &pet) {
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
lcd.setCursor(0, 0);
|
lcd.setCursor(0, 0);
|
||||||
@@ -56,7 +56,9 @@ void Display::drawPet(Pet &pet) {
|
|||||||
lcd.print("Energy: " + String(pet.getEnergy()));
|
lcd.print("Energy: " + String(pet.getEnergy()));
|
||||||
lcd.setCursor(0, 3);
|
lcd.setCursor(0, 3);
|
||||||
lcd.print("Cleanliness: " + String(pet.getCleanliness()));
|
lcd.print("Cleanliness: " + String(pet.getCleanliness()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display::drawPet(Pet &pet) {
|
||||||
lcd.setCursor(LCD_COLS - 2, LCD_ROWS / 2 - 1); // Position the pet
|
lcd.setCursor(LCD_COLS - 2, LCD_ROWS / 2 - 1); // Position the pet
|
||||||
lcd.write(pet.getAnimationFrame()); // Draw the custom pet character
|
lcd.write(pet.getAnimationFrame()); // Draw the custom pet character
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-1
@@ -86,7 +86,14 @@ void Game::update() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Game::render() {
|
void Game::render() {
|
||||||
|
// If the display doesn't need to be cleared, we can skip rendering
|
||||||
if (!state.shouldClearDisplay) {
|
if (!state.shouldClearDisplay) {
|
||||||
|
// However, we still need to draw the pet if it's alive and
|
||||||
|
// we're not in the menu
|
||||||
|
if (state.pet.isAlive && !state.isMenuOpen) {
|
||||||
|
display.drawPet(state.pet);
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,7 +119,7 @@ void Game::render() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Render the pet's stats on the display
|
// Render the pet's stats on the display
|
||||||
display.drawPet(state.pet);
|
display.drawPetStats(state.pet);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::forceUpdate(String reason) {
|
void Game::forceUpdate(String reason) {
|
||||||
|
|||||||
+3
-3
@@ -29,9 +29,9 @@ Joystick::Joystick() : vrx(A0), vry(A1), sw(Switch(4)) {
|
|||||||
pinMode(vrx, INPUT);
|
pinMode(vrx, INPUT);
|
||||||
pinMode(vry, INPUT);
|
pinMode(vry, INPUT);
|
||||||
|
|
||||||
// Calibrate the joystick by reading the center position and storing it as an offset
|
// TODO: Calibrate the joystick by reading the center position and storing it as an offset
|
||||||
xOffset = map(analogRead(vrx), 0, 1023, -100, 100);
|
xOffset = 10;
|
||||||
yOffset = map(analogRead(vry), 0, 1023, -100, 100);
|
yOffset = 13;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map the analog readings from the joystick to a range of -100 to 100 for both X and Y axes
|
// Map the analog readings from the joystick to a range of -100 to 100 for both X and Y axes
|
||||||
|
|||||||
+17
-4
@@ -1,7 +1,15 @@
|
|||||||
#include "pet.hpp"
|
#include "pet.hpp"
|
||||||
|
|
||||||
Pet::Pet()
|
Pet::Pet() :
|
||||||
: isAlive(true), hunger(0), joy(100), energy(100), cleanliness(100), reasonForDeath(""), lastAnimationFrame(0) {}
|
isAlive(true),
|
||||||
|
hunger(0),
|
||||||
|
joy(100),
|
||||||
|
energy(100),
|
||||||
|
cleanliness(100),
|
||||||
|
reasonForDeath(""),
|
||||||
|
lastAnimationFrame(0),
|
||||||
|
lastAnimationFrameTime(0)
|
||||||
|
{}
|
||||||
|
|
||||||
void Pet::updateHunger(int8_t delta) {
|
void Pet::updateHunger(int8_t delta) {
|
||||||
hunger += delta;
|
hunger += delta;
|
||||||
@@ -84,7 +92,12 @@ String Pet::getReasonForDeath() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
byte Pet::getAnimationFrame() {
|
byte Pet::getAnimationFrame() {
|
||||||
// Alternate between two frames for a simple animation effect
|
uint64_t currentTime = millis();
|
||||||
lastAnimationFrame = (lastAnimationFrame + 1) % 2;
|
|
||||||
|
if (currentTime - lastAnimationFrameTime >= ANIMATION_FRAME_INTERVAL) {
|
||||||
|
lastAnimationFrameTime = currentTime;
|
||||||
|
lastAnimationFrame = (lastAnimationFrame + 1) % 2; // Alternate between frame 0 and 1
|
||||||
|
}
|
||||||
|
|
||||||
return lastAnimationFrame;
|
return lastAnimationFrame;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user