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:
58
source/shapes/png_shape.h
Normal file
58
source/shapes/png_shape.h
Normal file
@@ -0,0 +1,58 @@
|
||||
#pragma once
|
||||
|
||||
#include "shape.h"
|
||||
#include <vector>
|
||||
|
||||
// Figura: Shape generada desde PNG 1-bit (blanco sobre negro)
|
||||
// Enfoque A: Extrusión 2D (implementado)
|
||||
// Enfoque B: Voxelización 3D (preparado para futuro)
|
||||
class PNGShape : public Shape {
|
||||
private:
|
||||
// Datos de la imagen cargada
|
||||
int image_width_ = 0;
|
||||
int image_height_ = 0;
|
||||
std::vector<bool> pixel_data_; // Mapa de píxeles blancos (true = blanco)
|
||||
|
||||
// Puntos generados (Enfoque A: Extrusión 2D)
|
||||
struct Point2D {
|
||||
float x, y;
|
||||
};
|
||||
std::vector<Point2D> edge_points_; // Contorno (solo bordes)
|
||||
std::vector<Point2D> filled_points_; // Relleno completo (para Enfoque B)
|
||||
|
||||
// Parámetros de extrusión
|
||||
float extrusion_depth_ = 0.0f; // Profundidad de extrusión en Z
|
||||
int num_layers_ = 0; // Capas de extrusión (más capas = más denso)
|
||||
|
||||
// Rotación "legible" (de frente con volteretas ocasionales)
|
||||
float angle_x_ = 0.0f;
|
||||
float angle_y_ = 0.0f;
|
||||
float idle_timer_ = 0.0f; // Timer para tiempo de frente
|
||||
float flip_timer_ = 0.0f; // Timer para voltereta
|
||||
float next_idle_time_ = 5.0f; // Próximo tiempo de espera (aleatorio)
|
||||
bool is_flipping_ = false; // Estado: quieto o voltereta
|
||||
int flip_axis_ = 0; // Eje de voltereta (0=X, 1=Y, 2=ambos)
|
||||
|
||||
// Dimensiones normalizadas
|
||||
float scale_factor_ = 1.0f;
|
||||
float center_offset_x_ = 0.0f;
|
||||
float center_offset_y_ = 0.0f;
|
||||
|
||||
int num_points_ = 0; // Total de puntos generados (para indexación)
|
||||
|
||||
// Métodos internos
|
||||
bool loadPNG(const char* path); // Cargar PNG con stb_image
|
||||
void detectEdges(); // Detectar contorno (Enfoque A)
|
||||
void floodFill(); // Rellenar interior (Enfoque B - futuro)
|
||||
void generateExtrudedPoints(); // Generar puntos con extrusión 2D
|
||||
|
||||
public:
|
||||
// Constructor: recibe path relativo al PNG
|
||||
PNGShape(const char* png_path = "data/shapes/jailgames.png");
|
||||
|
||||
void generatePoints(int num_points, float screen_width, float screen_height) override;
|
||||
void update(float delta_time, float screen_width, float screen_height) override;
|
||||
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;
|
||||
};
|
||||
Reference in New Issue
Block a user