From a7c9304214db420e0585c41aaa9e0af835a63f1a Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 5 Oct 2025 10:17:46 +0200 Subject: [PATCH] Fix: Carga de recursos en macOS Bundle + limpieza Makefile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Arreglar getExecutableDirectory() para usar _NSGetExecutablePath en macOS - Añadir getResourcesDirectory() con soporte MACOS_BUNDLE - Actualizar main.cpp y engine.cpp para buscar recursos correctamente - Eliminar referencias obsoletas a directorio 'config' en Makefile Ahora resources.pack se busca en ../Resources/ cuando MACOS_BUNDLE está definido, permitiendo que la app bundle funcione correctamente. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- Makefile | 5 ----- source/defines.h | 26 ++++++++++++++++++++++++++ source/engine.cpp | 4 ++-- source/main.cpp | 4 ++-- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 29fc16e..99b83ff 100644 --- a/Makefile +++ b/Makefile @@ -183,7 +183,6 @@ macos_release: resources.pack $(MKDIR) Frameworks # Copia carpetas y ficheros - cp -R config "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources" cp resources.pack "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources" cp -R release/frameworks/SDL3.xcframework "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks" cp -R release/frameworks/SDL3.xcframework Frameworks @@ -243,7 +242,6 @@ linux_release: resources.pack $(MKDIR) "$(RELEASE_FOLDER)" # Copia ficheros - cp -R config "$(RELEASE_FOLDER)" cp resources.pack "$(RELEASE_FOLDER)" cp LICENSE "$(RELEASE_FOLDER)" cp README.md "$(RELEASE_FOLDER)" @@ -273,7 +271,6 @@ linux_release_desktop: resources.pack $(MKDIR) "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/$(TARGET_NAME)" # Copia ficheros del juego - cp -R config "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/$(TARGET_NAME)/" cp resources.pack "$(RELEASE_FOLDER)/$(TARGET_NAME)/share/$(TARGET_NAME)/" cp LICENSE "$(RELEASE_FOLDER)/$(TARGET_NAME)/" cp README.md "$(RELEASE_FOLDER)/$(TARGET_NAME)/" @@ -374,7 +371,6 @@ raspi_release: resources.pack $(MKDIR) "$(RELEASE_FOLDER)" # Copia ficheros - cp -R config "$(RELEASE_FOLDER)" cp resources.pack "$(RELEASE_FOLDER)" cp LICENSE "$(RELEASE_FOLDER)" cp README.md "$(RELEASE_FOLDER)" @@ -400,7 +396,6 @@ anbernic: resources.pack $(MKDIR) "$(RELEASE_FOLDER)"_anbernic # Copia ficheros - cp -R config "$(RELEASE_FOLDER)"_anbernic cp resources.pack "$(RELEASE_FOLDER)"_anbernic # Compila diff --git a/source/defines.h b/source/defines.h index 3e204e2..f0bea87 100644 --- a/source/defines.h +++ b/source/defines.h @@ -231,6 +231,9 @@ constexpr float PI = 3.14159265358979323846f; // Constante PI #include #ifdef _WIN32 #include +#elif defined(__APPLE__) +#include +#include #else #include #include @@ -242,7 +245,16 @@ inline std::string getExecutableDirectory() { GetModuleFileNameA(NULL, buffer, MAX_PATH); std::filesystem::path exe_path(buffer); return exe_path.parent_path().string(); +#elif defined(__APPLE__) + char buffer[PATH_MAX]; + uint32_t size = sizeof(buffer); + if (_NSGetExecutablePath(buffer, &size) == 0) { + std::filesystem::path exe_path(buffer); + return exe_path.parent_path().string(); + } + return "."; #else + // Linux y otros Unix char buffer[PATH_MAX]; ssize_t len = readlink("/proc/self/exe", buffer, sizeof(buffer) - 1); if (len != -1) { @@ -252,4 +264,18 @@ inline std::string getExecutableDirectory() { } return "."; #endif +} + +// Función auxiliar para obtener la ruta del directorio de recursos +inline std::string getResourcesDirectory() { + std::string exe_dir = getExecutableDirectory(); + +#ifdef MACOS_BUNDLE + // En macOS Bundle: ejecutable está en Contents/MacOS/, recursos en Contents/Resources/ + std::filesystem::path resources_path = std::filesystem::path(exe_dir) / ".." / "Resources"; + return resources_path.string(); +#else + // En desarrollo o releases normales: recursos están junto al ejecutable + return exe_dir; +#endif } \ No newline at end of file diff --git a/source/engine.cpp b/source/engine.cpp index 3642b64..0b6dd91 100644 --- a/source/engine.cpp +++ b/source/engine.cpp @@ -128,8 +128,8 @@ bool Engine::initialize(int width, int height, int zoom, bool fullscreen) { // Inicializar otros componentes si SDL se inicializó correctamente if (success) { // Cargar todas las texturas disponibles desde data/balls/ - std::string exe_dir = getExecutableDirectory(); - std::string balls_dir = exe_dir + "/data/balls"; + std::string resources_dir = getResourcesDirectory(); + std::string balls_dir = resources_dir + "/data/balls"; struct TextureInfo { std::string name; diff --git a/source/main.cpp b/source/main.cpp index 6f218bf..75c182b 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -75,8 +75,8 @@ int main(int argc, char* argv[]) { } // Inicializar sistema de recursos empaquetados (intentar cargar resources.pack) - std::string exe_dir = getExecutableDirectory(); - std::string pack_path = exe_dir + "/resources.pack"; + std::string resources_dir = getResourcesDirectory(); + std::string pack_path = resources_dir + "/resources.pack"; Texture::initResourceSystem(pack_path); Engine engine;