- Crear ResourceManager singleton para gestión centralizada de recursos - Separar lógica de ResourcePack de la clase Texture - Adaptar TextRenderer para cargar fuentes TTF desde pack - Adaptar LogoScaler para cargar imágenes PNG desde pack - Actualizar main.cpp y engine.cpp para usar ResourceManager - Regenerar resources.pack con fuentes y logos incluidos Fixes: - Resuelve error de carga de fuentes desde disco - Resuelve error de carga de logos (can't fopen) - Implementa fallback automático a disco si no existe pack - Todas las clases ahora pueden cargar recursos desde pack 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
130 lines
5.4 KiB
C++
130 lines
5.4 KiB
C++
#include <iostream>
|
|
#include <cstring>
|
|
#include <string>
|
|
#include "engine.h"
|
|
#include "defines.h"
|
|
#include "resource_manager.h"
|
|
|
|
// getExecutableDirectory() ya está definido en defines.h como inline
|
|
|
|
void printHelp() {
|
|
std::cout << "ViBe3 Physics - Simulador de físicas avanzadas\n";
|
|
std::cout << "\nUso: vibe3_physics [opciones]\n\n";
|
|
std::cout << "Opciones:\n";
|
|
std::cout << " -w, --width <px> Ancho de resolución (default: 320)\n";
|
|
std::cout << " -h, --height <px> Alto de resolución (default: 240)\n";
|
|
std::cout << " -z, --zoom <n> Zoom de ventana (default: 3)\n";
|
|
std::cout << " -f, --fullscreen Modo pantalla completa (F3 - letterbox)\n";
|
|
std::cout << " -F, --real-fullscreen Modo pantalla completa real (F4 - nativo)\n";
|
|
std::cout << " -m, --mode <mode> Modo inicial: sandbox, demo, demo-lite, logo (default: sandbox)\n";
|
|
std::cout << " --help Mostrar esta ayuda\n\n";
|
|
std::cout << "Ejemplos:\n";
|
|
std::cout << " vibe3_physics # 320x240 zoom 3 (ventana 960x720)\n";
|
|
std::cout << " vibe3_physics -w 1920 -h 1080 # 1920x1080 zoom 1 (auto)\n";
|
|
std::cout << " vibe3_physics -w 640 -h 480 -z 2 # 640x480 zoom 2 (ventana 1280x960)\n";
|
|
std::cout << " vibe3_physics -f # Fullscreen letterbox (F3)\n";
|
|
std::cout << " vibe3_physics -F # Fullscreen real (F4 - resolución nativa)\n";
|
|
std::cout << " vibe3_physics --mode demo # Arrancar en modo DEMO (auto-play)\n";
|
|
std::cout << " vibe3_physics -m demo-lite # Arrancar en modo DEMO_LITE (solo física)\n";
|
|
std::cout << " vibe3_physics -F --mode logo # Fullscreen + modo LOGO (easter egg)\n\n";
|
|
std::cout << "Nota: Si resolución > pantalla, se usa default. Zoom se ajusta automáticamente.\n";
|
|
}
|
|
|
|
int main(int argc, char* argv[]) {
|
|
int width = 0;
|
|
int height = 0;
|
|
int zoom = 0;
|
|
bool fullscreen = false;
|
|
bool real_fullscreen = false;
|
|
AppMode initial_mode = AppMode::SANDBOX; // Modo inicial (default: SANDBOX)
|
|
|
|
// Parsear argumentos
|
|
for (int i = 1; i < argc; i++) {
|
|
if (strcmp(argv[i], "--help") == 0) {
|
|
printHelp();
|
|
return 0;
|
|
} else if (strcmp(argv[i], "-w") == 0 || strcmp(argv[i], "--width") == 0) {
|
|
if (i + 1 < argc) {
|
|
width = atoi(argv[++i]);
|
|
if (width < 320) {
|
|
std::cerr << "Error: Ancho mínimo es 320\n";
|
|
return -1;
|
|
}
|
|
} else {
|
|
std::cerr << "Error: -w/--width requiere un valor\n";
|
|
return -1;
|
|
}
|
|
} else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--height") == 0) {
|
|
if (i + 1 < argc) {
|
|
height = atoi(argv[++i]);
|
|
if (height < 240) {
|
|
std::cerr << "Error: Alto mínimo es 240\n";
|
|
return -1;
|
|
}
|
|
} else {
|
|
std::cerr << "Error: -h/--height requiere un valor\n";
|
|
return -1;
|
|
}
|
|
} else if (strcmp(argv[i], "-z") == 0 || strcmp(argv[i], "--zoom") == 0) {
|
|
if (i + 1 < argc) {
|
|
zoom = atoi(argv[++i]);
|
|
if (zoom < 1) {
|
|
std::cerr << "Error: Zoom mínimo es 1\n";
|
|
return -1;
|
|
}
|
|
} else {
|
|
std::cerr << "Error: -z/--zoom requiere un valor\n";
|
|
return -1;
|
|
}
|
|
} else if (strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "--fullscreen") == 0) {
|
|
fullscreen = true;
|
|
} else if (strcmp(argv[i], "-F") == 0 || strcmp(argv[i], "--real-fullscreen") == 0) {
|
|
real_fullscreen = true;
|
|
} else if (strcmp(argv[i], "-m") == 0 || strcmp(argv[i], "--mode") == 0) {
|
|
if (i + 1 < argc) {
|
|
std::string mode_str = argv[++i];
|
|
if (mode_str == "sandbox") {
|
|
initial_mode = AppMode::SANDBOX;
|
|
} else if (mode_str == "demo") {
|
|
initial_mode = AppMode::DEMO;
|
|
} else if (mode_str == "demo-lite") {
|
|
initial_mode = AppMode::DEMO_LITE;
|
|
} else if (mode_str == "logo") {
|
|
initial_mode = AppMode::LOGO;
|
|
} else {
|
|
std::cerr << "Error: Modo '" << mode_str << "' no válido. Usa: sandbox, demo, demo-lite, logo\n";
|
|
return -1;
|
|
}
|
|
} else {
|
|
std::cerr << "Error: -m/--mode requiere un valor\n";
|
|
return -1;
|
|
}
|
|
} else {
|
|
std::cerr << "Error: Opción desconocida '" << argv[i] << "'\n";
|
|
printHelp();
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
// Inicializar sistema de recursos empaquetados (intentar cargar resources.pack)
|
|
std::string resources_dir = getResourcesDirectory();
|
|
std::string pack_path = resources_dir + "/resources.pack";
|
|
ResourceManager::init(pack_path);
|
|
|
|
Engine engine;
|
|
|
|
if (!engine.initialize(width, height, zoom, fullscreen, initial_mode)) {
|
|
std::cout << "¡Error al inicializar el engine!" << std::endl;
|
|
return -1;
|
|
}
|
|
|
|
// Si se especificó real fullscreen (F4), activar después de inicializar
|
|
if (real_fullscreen) {
|
|
engine.toggleRealFullscreen();
|
|
}
|
|
|
|
engine.run();
|
|
engine.shutdown();
|
|
|
|
return 0;
|
|
} |