Refactor fase 10: Implementar BoidManager completo
Cambios realizados: - Creado BoidManager (source/boids_mgr/) con algoritmo de Reynolds (1987) * Separación: Evitar colisiones con vecinos cercanos * Alineación: Seguir dirección promedio del grupo * Cohesión: Moverse hacia centro de masa del grupo * Wrapping boundaries (teletransporte en bordes) * Velocidad y fuerza limitadas (steering behavior) - Añadido BOIDS a enum SimulationMode (defines.h) - Añadidas constantes de configuración boids (defines.h) - Integrado BoidManager en Engine (inicialización, update, toggle) - Añadido binding de tecla J para toggleBoidsMode() (input_handler.cpp) - Añadidos helpers en Ball: getVelocity(), setVelocity(), setPosition() - Actualizado CMakeLists.txt para incluir source/boids_mgr/*.cpp Arquitectura: - BoidManager sigue el patrón establecido (similar a ShapeManager) - Gestión independiente del comportamiento de enjambre - Tres reglas de Reynolds implementadas correctamente - Compatible con sistema de resolución dinámica Estado: Compilación exitosa, BoidManager funcional Próximo paso: Testing y ajuste de parámetros boids 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
107
source/boids_mgr/boid_manager.h
Normal file
107
source/boids_mgr/boid_manager.h
Normal file
@@ -0,0 +1,107 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstddef> // for size_t
|
||||
|
||||
#include "../defines.h" // for SimulationMode, AppMode
|
||||
|
||||
// Forward declarations
|
||||
class Engine;
|
||||
class SceneManager;
|
||||
class UIManager;
|
||||
class StateManager;
|
||||
class Ball;
|
||||
|
||||
/**
|
||||
* @class BoidManager
|
||||
* @brief Gestiona el comportamiento de enjambre (boids)
|
||||
*
|
||||
* Responsabilidad única: Implementación de algoritmo de boids (Reynolds 1987)
|
||||
*
|
||||
* Características:
|
||||
* - Separación: Evitar colisiones con vecinos cercanos
|
||||
* - Alineación: Seguir dirección promedio del grupo
|
||||
* - Cohesión: Moverse hacia el centro de masa del grupo
|
||||
* - Comportamiento emergente sin control centralizado
|
||||
* - Física de steering behavior (velocidad limitada)
|
||||
*/
|
||||
class BoidManager {
|
||||
public:
|
||||
/**
|
||||
* @brief Constructor
|
||||
*/
|
||||
BoidManager();
|
||||
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~BoidManager();
|
||||
|
||||
/**
|
||||
* @brief Inicializa el BoidManager con referencias a componentes del Engine
|
||||
* @param engine Puntero al Engine (para acceso a recursos)
|
||||
* @param scene_mgr Puntero a SceneManager (acceso a bolas)
|
||||
* @param ui_mgr Puntero a UIManager (notificaciones)
|
||||
* @param state_mgr Puntero a StateManager (estados de aplicación)
|
||||
* @param screen_width Ancho de pantalla actual
|
||||
* @param screen_height Alto de pantalla actual
|
||||
*/
|
||||
void initialize(Engine* engine, SceneManager* scene_mgr, UIManager* ui_mgr,
|
||||
StateManager* state_mgr, int screen_width, int screen_height);
|
||||
|
||||
/**
|
||||
* @brief Actualiza el tamaño de pantalla (llamado en resize/fullscreen)
|
||||
* @param width Nuevo ancho de pantalla
|
||||
* @param height Nuevo alto de pantalla
|
||||
*/
|
||||
void updateScreenSize(int width, int height);
|
||||
|
||||
/**
|
||||
* @brief Activa el modo boids
|
||||
*/
|
||||
void activateBoids();
|
||||
|
||||
/**
|
||||
* @brief Desactiva el modo boids (vuelve a física normal)
|
||||
* @param force_gravity_on Si debe forzar gravedad ON al salir
|
||||
*/
|
||||
void deactivateBoids(bool force_gravity_on = true);
|
||||
|
||||
/**
|
||||
* @brief Toggle entre modo boids y modo física
|
||||
* @param force_gravity_on Si debe forzar gravedad ON al salir de boids
|
||||
*/
|
||||
void toggleBoidsMode(bool force_gravity_on = true);
|
||||
|
||||
/**
|
||||
* @brief Actualiza el comportamiento de todas las bolas como boids
|
||||
* @param delta_time Delta time para física
|
||||
*/
|
||||
void update(float delta_time);
|
||||
|
||||
/**
|
||||
* @brief Verifica si el modo boids está activo
|
||||
* @return true si modo boids está activo
|
||||
*/
|
||||
bool isBoidsActive() const { return boids_active_; }
|
||||
|
||||
private:
|
||||
// Referencias a componentes del Engine
|
||||
Engine* engine_;
|
||||
SceneManager* scene_mgr_;
|
||||
UIManager* ui_mgr_;
|
||||
StateManager* state_mgr_;
|
||||
|
||||
// Tamaño de pantalla
|
||||
int screen_width_;
|
||||
int screen_height_;
|
||||
|
||||
// Estado del modo boids
|
||||
bool boids_active_;
|
||||
|
||||
// Métodos privados para las reglas de Reynolds
|
||||
void applySeparation(Ball* boid, float delta_time);
|
||||
void applyAlignment(Ball* boid, float delta_time);
|
||||
void applyCohesion(Ball* boid, float delta_time);
|
||||
void applyBoundaries(Ball* boid); // Mantener boids dentro de pantalla
|
||||
void limitSpeed(Ball* boid); // Limitar velocidad máxima
|
||||
};
|
||||
Reference in New Issue
Block a user