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

@@ -303,8 +303,10 @@ void Ball::enableRotoBallAttraction(bool enable) {
}
}
// Aplicar fuerza de resorte hacia punto objetivo en esfera rotante
void Ball::applyRotoBallForce(float target_x, float target_y, float sphere_radius, float deltaTime) {
// Aplicar fuerza de resorte hacia punto objetivo en figuras 3D
void Ball::applyRotoBallForce(float target_x, float target_y, float sphere_radius, float deltaTime,
float spring_k_base, float damping_base_base, float damping_near_base,
float near_threshold_base, float max_force_base) {
if (!rotoball_attraction_active_) return;
// Calcular factor de escala basado en el radio (radio base = 80px)
@@ -313,11 +315,11 @@ void Ball::applyRotoBallForce(float target_x, float target_y, float sphere_radiu
float scale = sphere_radius / BASE_RADIUS;
// Escalar constantes de física proporcionalmente
float spring_k = ROTOBALL_SPRING_K * scale;
float damping_base = ROTOBALL_DAMPING_BASE * scale;
float damping_near = ROTOBALL_DAMPING_NEAR * scale;
float near_threshold = ROTOBALL_NEAR_THRESHOLD * scale;
float max_force = ROTOBALL_MAX_FORCE * scale;
float spring_k = spring_k_base * scale;
float damping_base = damping_base_base * scale;
float damping_near = damping_near_base * scale;
float near_threshold = near_threshold_base * scale;
float max_force = max_force_base * scale;
// Calcular vector diferencia (dirección hacia el target)
float diff_x = target_x - pos_.x;