I have a specific problem with compiling my program on a Mac. At this point everything is good with on a Windows. So I'm sure that the problem is not inside the code, it is a platform problem only.
What I use:
- JetBrains CLion IDE
- C++ 17
- CMake
- raylib library (https://www.raylib.com/)
My current project is a very small game I used to start to study C++ so I used several textures to load them to create sprites and backgrounds.
#include <map>
#include <string>
std::map<std::string, const char *> assetsPaths{{"worldMap", "../assets/worldMap.png"},
{"knightIdle", "../assets/character/knight_idle_spritesheet.png"},
{"knightRun", "../assets/character/knight_run_spritesheet.png"},
{"goblinIdle", "../assets/enemy/goblin/goblin_idle_spritesheet.png"},
{"goblinRun", "../assets/enemy/goblin/goblin_run_spritesheet.png"},
{"rock", "../assets/obstacles/rock.png"},
{"log", "../assets/obstacles/log.png"},
{"sword", "../assets/weapon/sword/weapon_sword.png"}};
You may notice that all paths are relative to executable position.
Then when I start the game from the IDE everything seems to work fine:
INFO: FILEIO: [../assets/enemy/goblin/goblin_idle_spritesheet.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 3] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [../assets/enemy/goblin/goblin_run_spritesheet.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 4] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [../assets/character/knight_idle_spritesheet.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 5] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [../assets/character/knight_run_spritesheet.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 6] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [../assets/obstacles/log.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (27x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 7] Texture loaded successfully (27x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [../assets/obstacles/rock.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (22x21 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 8] Texture loaded successfully (22x21 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [../assets/weapon/sword/weapon_sword.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (16x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 9] Texture loaded successfully (16x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [../assets/worldMap.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (768x768 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 10] Texture loaded successfully (768x768 | R8G8B8A8 | 1 mipmaps)
But when I'm trying to run executable in a folder I'm getting this:
WARNING: FILEIO: [../assets/enemy/goblin/goblin_idle_spritesheet.png] Failed to open file
WARNING: FILEIO: [../assets/enemy/goblin/goblin_run_spritesheet.png] Failed to open file
WARNING: FILEIO: [../assets/character/knight_idle_spritesheet.png] Failed to open file
WARNING: FILEIO: [../assets/character/knight_run_spritesheet.png] Failed to open file
WARNING: FILEIO: [../assets/obstacles/log.png] Failed to open file
WARNING: FILEIO: [../assets/obstacles/rock.png] Failed to open file
WARNING: FILEIO: [../assets/weapon/sword/weapon_sword.png] Failed to open file
WARNING: FILEIO: [../assets/worldMap.png] Failed to open file
I understood that the problem is somewhere in reading paths. So when I tried to use absolute paths just to test my theory everything worked fine. But it is very inconvenient because game definitely will not work on another machine.
I tried this line of code to understand what is happening.
std::cout << "Run path: " << GetWorkingDirectory() << std::endl;
And there are results:
Running via IDE:
Run path: /Users/nickrimer/cpp/classy_clash_game/cmake-build-debug
Running via executable in a folder:
Run path: /Users/nickrimer
I don't know why but system thinks that I'm running inside of my root folder, of course there are no assets on this path. I make sure that file I'm running lies inside this folder: /Users/nickrimer/cpp/classy_clash_game/cmake-build-debug
Actually it doesn't even matter in which folder this executable will be placed, its executable context is always incorrect and always refers to a root folder.
So the question is how to run executable on a MacOS platform with the right execution context?
Please just tell me if I have to provide you more necessary information about this build.