Implementar sistema de estados mutuamente excluyentes y fix PNG_SHAPE flip en LOGO
## 1. Sistema de Estados AppMode (MANUAL/DEMO/DEMO_LITE/LOGO) **engine.h:** - Creado enum AppMode con 4 estados mutuamente excluyentes - Reemplazadas 4 flags booleanas por 2 variables de estado: * current_app_mode_: Modo actual * previous_app_mode_: Para restaurar al salir de LOGO - Añadido método setState() para gestión centralizada **engine.cpp:** - Implementado setState() con configuración automática de timers - Actualizado updateDemoMode() para usar current_app_mode_ - Actualizado handleEvents() para teclas D/L/K con setState() - Actualizadas todas las referencias a flags antiguas (8 ubicaciones) - enterLogoMode/exitLogoMode usan setState() **Comportamiento:** - Teclas D/L/K ahora desactivan otros modos automáticamente - Al salir de LOGO vuelve al modo previo (DEMO/DEMO_LITE/MANUAL) ## 2. Ajuste Ratio DEMO:LOGO = 6:1 **defines.h:** - Probabilidad DEMO→LOGO: 15% → 5% (más raro) - Probabilidad DEMO_LITE→LOGO: 10% → 3% - Probabilidad salir de LOGO: 25% → 60% (sale rápido) - Intervalos LOGO: 4-8s → 3-5s (más corto que DEMO) **Resultado:** DEMO pasa 6x más tiempo activo que LOGO ## 3. Fix PNG_SHAPE no hace flip en modo LOGO **Bugs encontrados:** 1. next_idle_time_ inicializado a 5.0s (hardcoded) > intervalos LOGO (3-5s) 2. toggleShapeMode() recrea PNG_SHAPE → pierde is_logo_mode_=true **Soluciones:** **png_shape.cpp (constructor):** - Inicializa next_idle_time_ con PNG_IDLE_TIME_MIN/MAX (no hardcoded) **png_shape.h:** - Añadidos includes: defines.h, <cstdlib> - Flag is_logo_mode_ para distinguir MANUAL vs LOGO - Expandido setLogoMode() para recalcular next_idle_time_ con rangos apropiados - PNG_IDLE_TIME_MIN_LOGO/MAX_LOGO: 2.5-4.5s (ajustable en defines.h) **engine.cpp (toggleShapeMode):** - Detecta si vuelve a SHAPE en modo LOGO con PNG_SHAPE - Restaura setLogoMode(true) después de recrear instancia **defines.h:** - PNG_IDLE_TIME_MIN/MAX = 0.5-2.0s (modo MANUAL) - PNG_IDLE_TIME_MIN_LOGO/MAX_LOGO = 2.5-4.5s (modo LOGO) **Resultado:** PNG_SHAPE ahora hace flip cada 2.5-4.5s en modo LOGO (visible antes de toggles) ## 4. Nuevas Texturas **data/balls/big.png:** 16x16px (añadida) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -14,6 +14,9 @@ PNGShape::PNGShape(const char* png_path) {
|
||||
image_height_ = 10;
|
||||
pixel_data_.resize(100, true); // Cuadrado 10x10 blanco
|
||||
}
|
||||
|
||||
// Inicializar next_idle_time_ con valores apropiados (no hardcoded 5.0)
|
||||
next_idle_time_ = PNG_IDLE_TIME_MIN + (rand() % 1000) / 1000.0f * (PNG_IDLE_TIME_MAX - PNG_IDLE_TIME_MIN);
|
||||
}
|
||||
|
||||
bool PNGShape::loadPNG(const char* path) {
|
||||
@@ -280,9 +283,10 @@ void PNGShape::update(float delta_time, float screen_width, float screen_height)
|
||||
// Elegir eje aleatorio (0=X, 1=Y, 2=ambos)
|
||||
flip_axis_ = rand() % 3;
|
||||
|
||||
// Próximo tiempo idle aleatorio
|
||||
next_idle_time_ = PNG_IDLE_TIME_MIN +
|
||||
(rand() % 1000) / 1000.0f * (PNG_IDLE_TIME_MAX - PNG_IDLE_TIME_MIN);
|
||||
// Próximo tiempo idle aleatorio (según modo LOGO o MANUAL)
|
||||
float idle_min = is_logo_mode_ ? PNG_IDLE_TIME_MIN_LOGO : PNG_IDLE_TIME_MIN;
|
||||
float idle_max = is_logo_mode_ ? PNG_IDLE_TIME_MAX_LOGO : PNG_IDLE_TIME_MAX;
|
||||
next_idle_time_ = idle_min + (rand() % 1000) / 1000.0f * (idle_max - idle_min);
|
||||
}
|
||||
} else {
|
||||
// Estado FLIP: voltereta en curso
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include "shape.h"
|
||||
#include "../defines.h" // Para PNG_IDLE_TIME_MIN/MAX constantes
|
||||
#include <vector>
|
||||
#include <cstdlib> // Para rand()
|
||||
|
||||
// Figura: Shape generada desde PNG 1-bit (blanco sobre negro)
|
||||
// Enfoque A: Extrusión 2D (implementado)
|
||||
@@ -38,6 +40,9 @@ private:
|
||||
float tilt_x_ = 0.0f; // Oscilación sutil en eje X
|
||||
float tilt_y_ = 0.0f; // Oscilación sutil en eje Y
|
||||
|
||||
// Modo LOGO (intervalos de flip más largos)
|
||||
bool is_logo_mode_ = false; // true = usar intervalos LOGO (más lentos)
|
||||
|
||||
// Dimensiones normalizadas
|
||||
float scale_factor_ = 1.0f;
|
||||
float center_offset_x_ = 0.0f;
|
||||
@@ -64,4 +69,13 @@ public:
|
||||
void getPoint3D(int index, float& x, float& y, float& z) const override;
|
||||
const char* getName() const override { return "PNG SHAPE"; }
|
||||
float getScaleFactor(float screen_height) const override;
|
||||
|
||||
// Control de modo LOGO (flip intervals más largos)
|
||||
void setLogoMode(bool enable) {
|
||||
is_logo_mode_ = enable;
|
||||
// Recalcular next_idle_time_ con el rango apropiado
|
||||
float idle_min = enable ? PNG_IDLE_TIME_MIN_LOGO : PNG_IDLE_TIME_MIN;
|
||||
float idle_max = enable ? PNG_IDLE_TIME_MAX_LOGO : PNG_IDLE_TIME_MAX;
|
||||
next_idle_time_ = idle_min + (rand() % 1000) / 1000.0f * (idle_max - idle_min);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user