afegit escenari personalitzat per parametre
This commit is contained in:
@@ -226,6 +226,10 @@ bool Engine::initialize(int width, int height, int zoom, bool fullscreen, AppMod
|
||||
scene_manager_ = std::make_unique<SceneManager>(current_screen_width_, current_screen_height_);
|
||||
scene_manager_->initialize(0, texture_, theme_manager_.get()); // Escenario 0 (10 bolas) por defecto
|
||||
|
||||
// Propagar configuración custom si fue establecida antes de initialize()
|
||||
if (custom_scenario_enabled_)
|
||||
scene_manager_->setCustomBallCount(custom_scenario_balls_);
|
||||
|
||||
// Calcular tamaño físico de ventana ANTES de inicializar UIManager
|
||||
// NOTA: No llamar a updatePhysicalWindowSize() aquí porque ui_manager_ aún no existe
|
||||
// Calcular manualmente para poder pasar valores al constructor de UIManager
|
||||
@@ -550,6 +554,15 @@ void Engine::switchTexture() {
|
||||
switchTextureInternal(true); // Mostrar notificación en modo manual
|
||||
}
|
||||
|
||||
// Escenario custom (--custom-balls)
|
||||
void Engine::setCustomScenario(int balls) {
|
||||
custom_scenario_balls_ = balls;
|
||||
custom_scenario_enabled_ = true;
|
||||
// scene_manager_ puede no existir aún (llamada pre-init); propagación en initialize()
|
||||
if (scene_manager_)
|
||||
scene_manager_->setCustomBallCount(balls);
|
||||
}
|
||||
|
||||
// Escenarios (número de pelotas)
|
||||
void Engine::changeScenario(int scenario_id, const char* notification_text) {
|
||||
// Pasar el modo actual al SceneManager para inicialización correcta
|
||||
@@ -1420,8 +1433,12 @@ void Engine::executeDemoAction(bool is_lite) {
|
||||
accumulated_weight += DEMO_WEIGHT_SCENARIO;
|
||||
if (random_value < accumulated_weight) {
|
||||
int auto_max = std::min(max_auto_scenario_, DEMO_AUTO_MAX_SCENARIO);
|
||||
int range = auto_max - DEMO_AUTO_MIN_SCENARIO + 1;
|
||||
int new_scenario = DEMO_AUTO_MIN_SCENARIO + (rand() % range);
|
||||
std::vector<int> candidates;
|
||||
for (int i = DEMO_AUTO_MIN_SCENARIO; i <= auto_max; ++i)
|
||||
candidates.push_back(i);
|
||||
if (custom_scenario_enabled_ && custom_auto_available_)
|
||||
candidates.push_back(CUSTOM_SCENARIO_IDX);
|
||||
int new_scenario = candidates[rand() % candidates.size()];
|
||||
scene_manager_->changeScenario(new_scenario, current_mode_);
|
||||
|
||||
// Si estamos en modo SHAPE, regenerar la figura con nuevo número de pelotas
|
||||
@@ -1578,8 +1595,12 @@ void Engine::executeRandomizeOnDemoStart(bool is_lite) {
|
||||
|
||||
// 2. Escenario - rango dinámico según benchmark de rendimiento
|
||||
int auto_max = std::min(max_auto_scenario_, DEMO_AUTO_MAX_SCENARIO);
|
||||
int range = auto_max - DEMO_AUTO_MIN_SCENARIO + 1;
|
||||
int new_scenario = DEMO_AUTO_MIN_SCENARIO + (rand() % range);
|
||||
std::vector<int> candidates;
|
||||
for (int i = DEMO_AUTO_MIN_SCENARIO; i <= auto_max; ++i)
|
||||
candidates.push_back(i);
|
||||
if (custom_scenario_enabled_ && custom_auto_available_)
|
||||
candidates.push_back(CUSTOM_SCENARIO_IDX);
|
||||
int new_scenario = candidates[rand() % candidates.size()];
|
||||
scene_manager_->changeScenario(new_scenario, current_mode_);
|
||||
|
||||
// Si estamos en modo SHAPE, generar la figura y activar atracción
|
||||
@@ -1653,6 +1674,30 @@ void Engine::runPerformanceBenchmark() {
|
||||
last_frame_time_ = 0;
|
||||
};
|
||||
|
||||
// Test escenario custom (independiente de max_auto_scenario_)
|
||||
custom_auto_available_ = false;
|
||||
if (custom_scenario_enabled_) {
|
||||
scene_manager_->changeScenario(CUSTOM_SCENARIO_IDX, current_mode_);
|
||||
last_frame_time_ = 0;
|
||||
for (int w = 0; w < WARMUP_FRAMES; ++w) {
|
||||
calculateDeltaTime();
|
||||
SDL_Event e; while (SDL_PollEvent(&e)) {}
|
||||
update();
|
||||
render();
|
||||
}
|
||||
int frame_count = 0;
|
||||
Uint64 start = SDL_GetTicks();
|
||||
while (SDL_GetTicks() - start < static_cast<Uint64>(BENCH_DURATION_MS)) {
|
||||
calculateDeltaTime();
|
||||
SDL_Event e; while (SDL_PollEvent(&e)) {}
|
||||
update();
|
||||
render();
|
||||
++frame_count;
|
||||
}
|
||||
float fps = static_cast<float>(frame_count) / (BENCH_DURATION_MS / 1000.0f);
|
||||
custom_auto_available_ = (fps >= monitor_hz);
|
||||
}
|
||||
|
||||
// Probar de más pesado a más ligero
|
||||
for (int idx = DEMO_AUTO_MAX_SCENARIO; idx >= DEMO_AUTO_MIN_SCENARIO; --idx) {
|
||||
scene_manager_->changeScenario(idx, current_mode_);
|
||||
|
||||
Reference in New Issue
Block a user