我从基于SDL(+调音台)的C语言PC应用程序移植了一些代码,这非常简单。但是,我对如何加载资源感到有点难过。
原始代码将其资源放在子目录中 - graphics /,sound /等。然后代码加载引用子目录的资源,例如Mix_LoadWAV(sounds/zap.waz)
。精灵以类似的方式处理,使用fopen(" graphics / stars.pcx")然后处理数据。
在Mac上,这些失败并找不到文件。我假设这是因为工作目录位于错误的位置,或者fopen需要完整的路径?
如果有任何OSX SDL人员,你对此有什么指示吗?
答案 0 :(得分:1)
fopen()
不需要完整路径。你可能是正确的,工作目录不是应用程序所期望的(虽然我不会说它是“错误的”,因为除了从命令行启动程序时,工作目录没有任何期望,用户控制它)。
改变工作目录的POSIX方式是:
#include <unistd.h>
int chdir(const char *path);
要发现应用程序包的路径,请使用Core Foundation的CFBundle API。所以,像这样:
#include <unistd.h>
#include <CoreFoundation/CoreFoundation.h>
...
CFURLRef url = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
char path[PATH_MAX];
if (!CFURLGetFileSystemRepresentation(url, true, (UInt8*)path, sizeof(path)) ||
chdir(path) != 0)
/* handle error */;
CFRelease(url);
这里我使用了app bundle(YourApp.app/Contents/Resources)中的Resources目录的路径。如果那不是您的资源文件实际所在的位置,那么您将使用其他CFBundle函数之一。