我刚刚完成了一个用C ++ SFML编写的基本RPG游戏,我在游戏中付出了很多努力,我想分发它,但是遇到了一个小问题。
问题是,我有200多个图像和地图文件(其中包含地图代码的.txt文件)都与可执行文件位于同一文件夹中,当我查看该文件夹时,这让我想哭一点如此众多的资源,我从未见过一款可以直接向您显示所有资源的游戏,相反,我相信它们会将资源打包在某个文件中。
好吧,这就是我要达到的目的:我希望将所有图像打包到1个文件(可能也包括.txt文件)中,然后能够从该文件中读取或轻松添加到其中。
我刚刚完成了一个用C ++ SFML编写的基本RPG游戏,我在游戏中付出了很多努力,我想分发它,但是遇到了一个小问题。
问题是,我有200多个图像和地图文件(其中包含地图代码的.txt文件)都与可执行文件位于同一文件夹中,当我查看该文件夹时,这让我想哭一点如此众多的资源,我从未见过一款可以直接向您显示所有资源的游戏,相反,我相信它们会将资源打包在某个文件中。
好吧,这就是我要达到的目的:我希望将所有图像打包到1个文件(可能也包括.txt文件)中,然后能够从该文件中读取或轻松添加到其中。
Answers:
游戏程序员依靠两种主要的数据存储方法之一:
第一种解决方案的缺点是浪费磁盘空间问题,以及安装速度较慢的问题。
第二种解决方案提供了它自己的陷阱,首先是您必须编写所有自己的图像/声音/等。使用自定义API来访问已归档数据的加载例程。另一个缺点是,您必须首先编写自己的存档实用程序来构建存档。
除非总是从归档文件中加载所有文件,否则TAR / GZ可能不是一个好主意,因为您无法根据需要提取特定文件。这就是许多游戏使用ZIP存档的原因,ZIP存档确实允许您根据需要提取单个文件(一个很好的例子是Quake 3,其PK3文件不过是具有不同扩展名的ZIP文件)。
编辑: “隐藏”游戏文件夹结构,仅“保留”可执行文件
另一个解决方案通常用于“隐藏”文件夹结构中的游戏文件。在主目录中仅保留可执行文件和自述文件,然后将游戏文件移动到名为“ data”或其他相关文件的子文件夹中。
编辑: Gamedev Tuts Plus有一个不错的资源
编辑: libarchive
一种可能的解决方案libarchive,它是一个归档库,它将处理从存档中提取文件的问题,例如ZIP文件。它甚至允许您将提取的文件分配给标准FILE指针,这将使与任何其他库的接口可能更直接。
编辑:具有其他扩展名的ZIP格式文件
在这里,我喜欢@Joachim Sauer的评论
在游戏之外,使用具有替代扩展名的ZIP格式文件也具有悠久的传统:Java可以做到,Java是OpenDocument格式(又名OpenOffice / LibreOffice格式),甚至Office Open XML(又名“新” Microsoft Office格式)都可以使用。做到了。
.tar
。这与数据物理存储在磁盘上的方式有关。
通常用于“隐藏”游戏文件的另一种解决方案是文件夹结构。在主目录中仅保留您的可执行文件,可能还保留一个自述文件,然后将游戏文件移动到子文件夹“ data”中。我认为这样做并非罕见。我知道许多游戏都以这种方式存储其内容。
我真的很喜欢PhysFS。它允许您使用相同的代码访问文件夹或zip存档。它在游戏生命周期的所有阶段都运作良好。
我使用了源附带的教程和doxygen文档来学习PhysFS。该API确实非常简单,您将花费更多的时间来学习如何通过内存缓冲区而不是文件路径将图像加载到SFML中。
好吧,您可以像他们提到的那样作弊:)您可以从图像中制作一张精灵表,如今无需压缩它,除非它节省了大量空间。从图像创建一个精灵表或几个精灵表后,您可以简单地重命名其扩展名。大多数游戏玩家都不会打扰检查,为什么不把这个选项留给将来可能要修改游戏的艺术家呢?这样,他们也可以创建一个sprite-sheet,重命名它的扩展名并开始滚动。
对于文本文件,我谨建议您将数据转换为二进制形式。我敢肯定,您会找到一种简单的方法。例如,如果您仅使用AZ,az和0-9,则可以使用6位来表示每个字符,这将在某种程度上保护您受版权保护的材料,也会阻止其他人编辑地图。.如果愿意,您随时可以添加地图转换器。压缩对于文本来说是完全合理的。
这不仅与资源或磁盘空间的数量有关。
在使用OpenGL渲染的SFML的情况下,有很多不同的纹理文件,每次要渲染纹理时,OpenGL都需要将下一个纹理绑定到视频卡(请检查glBindTexture()),并且一项非常昂贵的任务。
考虑到这一点,您可以了解为什么游戏通常会根据您的菜单/级别/地图,将多个精灵放置在相同的纹理(即所谓的精灵表)中。
结果是,通过使用相同的绑定纹理调用渲染许多精灵,可以极大地提高性能。
我将亲自为此定制二进制文件路由。这是我现在一直在做的事情,它听起来并不像听起来那么困难,而且还为您的游戏资源文件提供了一定程度的混淆。如果您有兴趣,我不久前写了一篇有关Gamedev的介绍性文章:
Sprite-sheets完全是一个不同的主题,但是对于大多数游戏来说,它们都是常态:)
首先,您必须编写所有自己的图像/声音/等。使用自定义API来访问已归档数据的加载例程。另一个缺点是,您必须首先编写自己的存档实用程序来构建存档。除非总是从存档中加载所有文件,否则TAR / GZ可能不是一个好主意,因为您无法根据需要提取特定文件。这就是许多游戏使用ZIP存档的原因,ZIP存档确实允许您根据需要提取单个文件(一个很好的例子是Quake 3,其PK3文件不过是具有不同扩展名的ZIP文件)。 http://zpp-library.sourceforge.net/