- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
游戏中的资源打包
游戏中的声音资源打包
董波
介绍
在以前的游戏当中,几乎所有的游戏都有将资源打包,无论是图形资源、声音文件等等。现在,越来越多的游戏的声音资源都公开了,通常背景音乐等采用ogg,音效采用wav;但是图形资源绝大部分游戏还是都是打包了的。有的有加密,有的没有。
在学习游戏编程的初期我就对这个东西很感兴趣,但是又没有人教,到网上找资料也少得可怜,所以就只好自己摸索了。记得去年也做过类似的工作,但是当时做的感觉很不好,采取了一些投机取巧的方法,虽然看起来是打包了,但是实际上只是一个躯壳而已。
随着时间的推移,自己懂得比以前稍微多了一点点,就想做点什么,即使现在还是“菜青虫”水平,“菜鸟”都算不上,呵呵。马上要毕业了,论文也早Over了,所以时间挺多的,因此写点这样的东西,希望现在的“曾经的我”能够从这个文章里边得到一点灵感。
这篇文章将介绍一种最简单的声音文件打包并播放的方法。最简单意味着它没有加密没有考虑太多的特殊情况,只实现了最简单的wav打包和播放,流媒体没考虑在内,因为它们的处理毕竟还是有很大的不同的。
注意
本文中所提到的程序以及附件都使用Visual Studio 2008 编写,项目文件也只能用VS2008打开。另外依赖于boost.filesystem、boost.shared_ptr、boost.unoredered_set,说白了如果您想查看效果的话必须安装boost,boost的安装教程可以参考我写得这个:/f/4875657.html 。另外声音播放我使用的Fmod引擎,所以您需要到/ 去下载最新的fmod引擎sdk安装并配置好VS。我相信VS2005和VS2008在配置正确的情况下应该都能编译通过的 。
文件打包
文件打包有很多方式的,我采取了一种比较简单的方式,我将打包后的结果分为数据文件和索引文件两部分,这样的好处是什么呢?至少我们追加文件的时候很方便也很快。加入我们采用文件头的形式,即索引在数据文件的头部,那么当我们要添加的新文件的时候,则意味着所有文件的重写,因为操作系统不会提供一个执行“插入”操作的API。这样最直接的好处就是游戏工具执行“保存”动作的时候的快速性。
另外,文件打包还可以选择是否加密,是否压缩等等。加密这块我不是很了解,我去年做过一个加了密的,但是后来反思的时候发现并没有什么意义,与其说文件打包是为了保护资源的话,还不如说是为了管理的方便和效率。因为我觉得在一个电脑高手面前,加不加密并没有什么意义,比如说传奇式的”mycrack”大大。压缩个人以为还是有点意义的,至少可以少占不少硬盘,当然,这是需要付出代价的,运行时必须解压。Ogre3D中就支持zip打包,应该也是使用zlib来做的,使用zlib来做这个事情是很容易的,呵呵。它的官方网站是:/
因此我们可以有这样的一个类来做这个简单的操作:
namespace db
{
class CFilePack
{
public:
typedef detail::Node node_type;
typedef detail::CFilePackImp::node_vec node_vec;
public:
CFilePack(
const std::wstring strDataFileName,
const std::wstring strIndexFileName
);
CFilePack(
const std::string strDataFileName,
const std::string strIndexFileName
);
~CFilePack();
public:
bool addFile( const std::string strFileName );
bool addFile( const std::wstring strFileName );
bool load();
bool save() const;
const node_vec getNodes() const
{
return m_spImp-getNodes();
}
protected:
boost::shared_ptrdetail::CFilePackImp m_spImp;
};
}
最终对CFilePack的调用将被转发到detail::CFilePackImp中。提供多种字符串的重载,最终将使用string_shim转换到char调用detail::CfilePackImp的对应的函数:
namespace db
{
namespace detail
{
您可能关注的文档
最近下载
- 电子电路与系统基础II(李国林)X006 12 第六讲习题课 电容电感性质习题课.pdf VIP
- 电动三轮车培训.pptx VIP
- 电子电路与系统基础II(李国林)S012 理论课第12讲 阻抗匹配网络.pdf VIP
- 工程伦理案例分析.docx VIP
- 统编版(2024)七年级历史上册第6课《战国时期的社会变革》课件.pptx VIP
- 电子电路与系统基础II(李国林)S005 09 第五讲理论课 向量法.pdf VIP
- 宜家 吸顶灯 RANARP 勒纳普 吊灯 003.909.52 安装指南.pdf
- 电子电路与系统基础II(李国林)S002 03 第二次理论课 运放应用.pdf VIP
- 工程伦理学习心得体会.docx VIP
- 工程伦理学学习心得.docx VIP
文档评论(0)