Mejorar interacción entre modos RotoBall y física con gestión de gravedad

Cambios principales:
- Fix: Pelotas ahora caen correctamente al salir de RotoBall (resetear on_surface_/stopped_)
- Fix: Al cambiar escenario en RotoBall, desactivar modo figura primero
- Feature: Al entrar en RotoBall, gravedad se desactiva automáticamente
- Feature: Tecla G desde RotoBall → Sale a física SIN gravedad (pelotas flotan)
- Feature: Tecla C desde RotoBall → Sale a física CON gravedad (pelotas caen)
- Feature: Cursores desde RotoBall → Sale a física CON gravedad + cambio dirección
- Feature: Cursores desde física sin gravedad → Reactiva gravedad automáticamente

Nuevos métodos:
- Ball::enableGravityIfDisabled() - Reactiva solo si está desactivada
- Ball::forceGravityOn() - Fuerza activación
- Ball::forceGravityOff() - Fuerza desactivación
- Engine::toggleRotoBallMode(bool force_gravity_on_exit) - Control de gravedad al salir

Lógica de controles desde RotoBall:
- C: Figura OFF → Física CON gravedad (caen)
- ↑↓←→: Figura OFF → Física CON gravedad + dirección (caen hacia dirección)
- G: Figura OFF → Física SIN gravedad (flotan)

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-03 19:34:33 +02:00
parent 31ac22bd0f
commit 535c397be2
4 changed files with 100 additions and 3 deletions

View File

@@ -227,6 +227,23 @@ void Ball::switchGravity() {
gravity_force_ = gravity_force_ == 0.0f ? (GRAVITY_FORCE * 60.0f * 60.0f) : 0.0f;
}
// Reactiva la gravedad si está desactivada
void Ball::enableGravityIfDisabled() {
if (gravity_force_ == 0.0f) {
gravity_force_ = GRAVITY_FORCE * 60.0f * 60.0f;
}
}
// Fuerza gravedad ON (siempre activa)
void Ball::forceGravityOn() {
gravity_force_ = GRAVITY_FORCE * 60.0f * 60.0f;
}
// Fuerza gravedad OFF (siempre desactiva)
void Ball::forceGravityOff() {
gravity_force_ = 0.0f;
}
// Cambia la dirección de gravedad
void Ball::setGravityDirection(GravityDirection direction) {
gravity_direction_ = direction;
@@ -283,6 +300,12 @@ void Ball::setDepthBrightness(float brightness) {
// Activar/desactivar atracción física hacia esfera RotoBall
void Ball::enableRotoBallAttraction(bool enable) {
rotoball_attraction_active_ = enable;
// Al activar atracción, resetear flags de superficie para permitir física completa
if (enable) {
on_surface_ = false;
stopped_ = false;
}
}
// Aplicar fuerza de resorte hacia punto objetivo en esfera rotante