Implementar PNG_SHAPE y sistema de física mejorado

Nuevas Características:
- PNG_SHAPE (tecla O): Logo JAILGAMES desde PNG 1-bit
  - Extrusión 2D con detección de bordes/relleno configurable
  - Rotación "legible": 90% frente, 10% volteretas aleatorias
  - 15 capas de extrusión con relleno completo (22K+ puntos 3D)
  - Fix: Z forzado a máximo cuando está de frente (brillante)
  - Excluido de DEMO/DEMO_LITE (logo especial)

- Sistema de texturas dinámicas
  - Carga automática desde data/balls/*.png
  - normal.png siempre primero, resto alfabético
  - Tecla N cicla entre todas las texturas encontradas
  - Display dinámico del nombre (uppercase)

- Física mejorada para figuras 3D
  - Constantes SHAPE separadas de ROTOBALL
  - SHAPE_SPRING_K=800 (+167% rigidez vs ROTOBALL)
  - SHAPE_DAMPING_NEAR=150 (+88% absorción)
  - Pelotas mucho más "pegadas" durante rotaciones
  - applyRotoBallForce() acepta parámetros personalizados

Archivos:
- NEW: source/shapes/png_shape.{h,cpp}
- NEW: data/shapes/jailgames.png
- NEW: data/balls/{normal,small,tiny}.png
- MOD: defines.h (constantes PNG + SHAPE physics)
- MOD: engine.cpp (carga dinámica texturas + física SHAPE)
- MOD: ball.{h,cpp} (parámetros física configurables)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-04 13:26:15 +02:00
parent 9eb03b5091
commit 0f0617066e
12 changed files with 411 additions and 34 deletions

View File

@@ -89,7 +89,12 @@ class Ball {
void setDepthScale(float scale);
float getDepthScale() const { return depth_scale_; }
// Sistema de atracción física hacia esfera RotoBall
// Sistema de atracción física hacia figuras 3D
void enableRotoBallAttraction(bool enable);
void applyRotoBallForce(float target_x, float target_y, float sphere_radius, float deltaTime);
void applyRotoBallForce(float target_x, float target_y, float sphere_radius, float deltaTime,
float spring_k = ROTOBALL_SPRING_K,
float damping_base = ROTOBALL_DAMPING_BASE,
float damping_near = ROTOBALL_DAMPING_NEAR,
float near_threshold = ROTOBALL_NEAR_THRESHOLD,
float max_force = ROTOBALL_MAX_FORCE);
};