gpt4 book ai didi

c++ - Xcode 5 C++ SDL 应用程序未在 XCode IDE 外部加载

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:47 25 4
gpt4 key购买 nike

过去一年我一直在编写游戏代码,目前正在移植到 Mac。

我已经根据以下内容设置了所有内容:http://blog.davidecoppola.com/2013/08/22/how-to-set-up-a-sdl-2-project-for-os-x-in-xcode-4/ .我更改了一些步骤以补偿版本 (5)。

在我的代码中,我使用 tinyXML 加载 Assets 文件夹中的 .xml 文件。这在 Windows 和 Linux 上完美运行,但是,在 Mac 上我遇到了一些问题。这是一行:

Doc.LoadFile(DataPath);

Doc 是一个 tinyxml2::XMLDocument 类型,DataPath 通常是“assets/Data.xml”,在 Mac 中我将该行硬编码到“DataPath”的位置。

在 IDE 中运行代码时,我没有遇到任何问题,并且我的游戏启动并像在所有其他平台上一样运行,但是,当运行 .app 文件(位于 gameMac/Build/Products/Debug 中)时,它崩溃了启动后。 Assets 文件夹也位于此位置。

这是崩溃后 Mac 向我抛出的错误:

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 gameMac 0x000c1525 tinyxml2::XMLNode::FirstChildElement(char const*) const + 21
1 gameMac 0x000d1954 tinyxml2::XMLNode::FirstChildElement(char const*) + 36
2 gameMac 0x000d04d5 DataLoader::load(char const*, ID_Data, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) + 197
3 gameMac 0x000a5849 MapHandler::MapHandler(std::__1::shared_ptr<gameData>) + 1177
4 gameMac 0x000a539e MapHandler::MapHandler(std::__1::shared_ptr<gameData>) + 30
5 gameMac 0x000b7eb8 splay::splay(std::__1::shared_ptr<gameData>) + 1592
6 gameMac 0x000b786e splay::splay(std::__1::shared_ptr<gameData>) + 30
7 gameMac 0x000ee3f9 std::__1::shared_ptr<splay> std::__1::shared_ptr<splay>::make_shared<std::__1::shared_ptr<gameData>&>(std::__1::shared_ptr<gameData>&&&) + 1849
8 gameMac 0x000ebc7c stateHandlerGen::stateHandlerGen(std::__1::shared_ptr<gameData>) + 236
9 gameMac 0x000ebb7e stateHandlerGen::stateHandlerGen(std::__1::shared_ptr<gameData>) + 30
10 gameMac 0x000e7a89 game::init(char const*, int, int, int, int, bool) + 1545
11 gameMac 0x000be8c4 main + 516
12 libdyld.dylib 0x91b3c725 start + 1

(请注意,gameMac 不是我项目的名称,由于 NDA,我更改了该细节)。

正如我在此处指出的那样,加载我的数据 DataLoader::load(params) 的相同方法导致了崩溃。这让我相信我的 Assets 文件夹没有被加载到我的 .app 文件中。

通过这个我尝试编辑构建阶段,Copy Bundle Resources 这并没有改变问题。然后我尝试创建一个新的构建阶段 Copy Files 并将其设置为 Resources,这也失败了。然后,我通过将 Copy Files 设置为 Product Directory 进行了实验;这将 Assets 文件夹复制到构建文件夹,但 .app 文件仍然不会加载到 Assets 中。

我错过了什么吗?一些 XCode 专家可以帮我解决这个问题吗,过去几天我一直在尝试解决这个问题。谢谢。

http://pastebin.com/Xq4Hxh4d (如上所述,这是我的 DataLoader 的顶部。编辑:在我的 nullptr 返回检查中添加,是的,如果失败则返回 true)。

P.S 我只能给出我的代码片段,我已经给出了我认为最有可能的问题,资源加载:)

完整的崩溃报告在下面的评论中。

修复,感谢 Brad Allred 的帮助:

资源位于 .app 文件中,特别是 {Application}/Contents/Resources ;在我的例子中,我想访问 Assets 中的文件。我做了一个构建阶段将数据复制到资源文件夹,使我的目录 {Application}/Contents/Resources/Assets/../.使用 SDL_GetBasePath 我能够创建一个字符串,它是从您的基本目录到 Resources 文件夹的绝对路径。

代码如下:

if(Doc.LoadFile("assets/Data.xml"))
{
std::string path = (std::string)SDL_GetBasePath() + "assets/Data.xml";
if(Doc.LoadFile(path.c_str()))
{
return false;
}
}

我连接基本路径 + 我需要的任何数据,并将 .c_str() 版本传递给 tinyXML。如果我找到更好/更干净的版本,我一定会在这里更新它。

最佳答案

你的crash report告诉您代码中发生崩溃的行号 (tinyxml2.cpp:745)。 at 可能您的 Assets 不在应用程序期望的位置或没有权限。检查您的 DataPath 以查看其尝试加载的位置应该让您开始。

您似乎错误地假设可以使用相对路径并获取与应用程序包相关的 Assets ;你不能那样做。

既然您使用的是 SDL,为什么不使用 SDL API(参见 SDL_GetBasePath)获取资源路径,以便您可以将 Assets 正确地存储在资源目录中内部您的应用程序包中?

关于c++ - Xcode 5 C++ SDL 应用程序未在 XCode IDE 外部加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26277344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com