Files
vibe3_physics/source/ball.h
Sergio Valor 036268f135 Implementar empuje lateral sutil al cambiar gravedad
🎯 Problema solucionado:
- Pelotas se movían en líneas perfectas al cambiar gravedad
- Todas llegaban exactamente una encima de otra

 Solución implementada:
- Empuje lateral aleatorio muy sutil (2.4-4.8 px/s)
- Se aplica automáticamente al cambiar dirección de gravedad
- Perpendicular a la gravedad: UP/DOWN → empuje X, LEFT/RIGHT → empuje Y

🔧 Implementación técnica:
- Nueva función Ball::applyRandomLateralPush()
- Integrada en Engine::changeGravityDirection()
- Velocidades ajustadas para ser apenas perceptibles

📊 Valores finales:
- GRAVITY_CHANGE_LATERAL_MIN = 0.04f (2.4 px/s)
- GRAVITY_CHANGE_LATERAL_MAX = 0.08f (4.8 px/s)
- Rango: ~3-5 píxeles en 1 segundo (muy sutil)

🎮 Resultado:
- Rompe la simetría perfecta sin crear caos
- Movimiento más natural y orgánico
- Mantiene la física realista

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-18 18:06:19 +02:00

60 lines
2.3 KiB
C++

#pragma once
#include <SDL3/SDL_rect.h> // for SDL_FRect
#include <memory> // for shared_ptr, unique_ptr
#include "defines.h" // for Color
#include "external/sprite.h" // for Sprite
class Texture;
class Ball {
private:
std::unique_ptr<Sprite> sprite_; // Sprite para pintar la clase
SDL_FRect pos_; // Posición y tamaño de la pelota
float vx_, vy_; // Velocidad
float gravity_force_; // Gravedad base
float gravity_mass_factor_; // Factor de masa individual (0.7-1.3, afecta gravedad)
GravityDirection gravity_direction_; // Direcci\u00f3n de la gravedad
Color color_; // Color de la pelota
bool on_surface_; // Indica si la pelota est\u00e1 en la superficie (suelo/techo/pared)
bool stopped_; // Indica si la pelota ha terminado de moverse;
float loss_; // Coeficiente de rebote. Pérdida de energía en cada rebote
public:
// Constructor
Ball(float x, float vx, float vy, Color color, std::shared_ptr<Texture> texture, GravityDirection gravity_dir = GravityDirection::DOWN, float mass_factor = 1.0f);
// Destructor
~Ball() = default;
// Actualiza la lógica de la clase
void update(float deltaTime);
// Pinta la clase
void render();
// Modifica la velocidad
void modVel(float vx, float vy);
// Cambia la gravedad
void switchGravity();
// Cambia la direcci\u00f3n de gravedad
void setGravityDirection(GravityDirection direction);
// Aplica un peque\u00f1o empuje lateral aleatorio
void applyRandomLateralPush();
// Getters para debug
float getVelocityY() const { return vy_; }
float getVelocityX() const { return vx_; }
float getGravityForce() const { return gravity_force_; }
float getLossCoefficient() const { return loss_; }
GravityDirection getGravityDirection() const { return gravity_direction_; }
bool isOnSurface() const { return on_surface_; }
// Getters para batch rendering
SDL_FRect getPosition() const { return pos_; }
Color getColor() const { return color_; }
};