【发布时间】:2014-07-02 13:00:26
【问题描述】:
好了。
我目前正在制作游戏 - 它是 C++/SDL2/OpenGL 组合,在 PC 上运行良好。长期目标是让这个便携,虽然考虑到我缺乏将它推到阳光下的每个平台上的大部分设备,第一个“端口”可能是用于 Android 驱动的手机和平板电脑。
SDL2 有一个官方(或“官方认可的”)Android 端口,经过数周与 Java 和 Eclipse 以及大部分损坏的 OpenGL ES 2.0 渲染器的讨价还价后,我已经在我可爱的 Nexus 7 平板电脑上运行了一些东西。它不快也不漂亮,但它是可以构建的。
但是,我的游戏,正如我想象的许多类似游戏一样,很大程度上依赖于从 XML 文件读取(和写入)数据,无论是保存、选项、关卡等等。但是 Android NDK 在编译时会压缩除少数文件格式之外的所有文件格式 - SDL2 具有从 Android 创建的 /assets/ 文件夹(存储我所有的东西)中提取图像和音频的功能,但我使用 TinyXML2 作为我的 XML处理,无法应付。
似乎有一小部分可能的解决方案(这是一个经常出现的问题 - 我很清楚在我输入此内容时,我右侧的“类似问题”框充满了类似的问题),但是每个人似乎都有相当大的警告或对代码的编写方式做出相当大的假设。最终结果通常是指向不适合tinyxml2 的古怪变量类型的指针,或者我在中途被卡住了,因为事实证明一块拼图不存在。真是太令人沮丧了。
方法 a) 似乎涉及在运行时解压缩 apk 并通过蛮力访问资产。这听起来像是一种非常糟糕的做事方式,在某些情况下似乎假设 apk 放置在特定位置。对我来说听起来很糟糕,而且实现起来很复杂?
方法 b) 让 Java 端有效地将指向 Android 资产管理器的指针传递给 C++ 端。这似乎更好,但是我看到的 Java 到 C++ Android 通信的示例似乎是针对非常小的“Hello World”风格的项目,在这些项目中你只是传递一个字符串或一个数字。我还读到这涉及编译 Java 标头并用它做一些新奇的事情 - 由于 Android 资产管理器不是标准数据类型或其他什么,因此该过程会失败。
c) SDL_RWops 是为 Android 准备的,可能是从文件中读取数据的更好方式。但它并没有解决随后的砖墙问题,因为我试图将这些东西转换成 tinyxml2 可以理解的东西。
方法 d) 似乎建议您可以将资产的扩展更改为不压缩。所以我所有的 XML 文件都变成了非官方的 PNG 或其他什么。这听起来也很糟糕,尤其是因为我有 40 多个 XML 文件需要管理。据说有一种方法可以调整哪些文件被压缩或不被压缩,但有些人似乎认为这是全有或全无,我不确定它是如何完成的。
请理解,当您在这方面工作了好几个小时时,很容易让自己被误导。虽然我承认自己弄清楚这些东西的好处,但网上的线索往往不完整、过时或完全错误。
所以是的,一个简单的指南会很可爱。我已经浪费了很多天来探索各种选择,我相信有一个明确的答案会对世界有益。
如前所述,这在 Windows PC 版本中运行良好 - 读取和写入不是问题,所以我知道这不像狡猾的文件那样愚蠢。对于我正在使用 Eclipse 的 Android 端口,如前所述,我正在测试的平板电脑是 Nexus 7。我有 C++ 和 Java 的工作知识,但这些繁琐的部分让我走上了弯路。
提前致谢
【问题讨论】:
标签: android c++ xml android-ndk