由于数据保护的需要,一款游戏一般都会有自己独有的资源包,这样做既有利于知识产权的保护,又减少了磁盘碎片的产生。Ogre本身是支持的Zip包的,但Zip包不具要资源保护的特性,随便用个winrar就可以把资源打开并导出,这样就失去了数据保护的意义。
现在假设你的操作资源包的API已经完成,下一步需要集成到OGRE中去,那么该怎么做呢,
大致我机械式的列出下面几步,照着做一般就不会错。
1. 继承Ogre::Archive 派生出新的,假设派生出 Ogre::XXXArchive
2. Ogre::XXXArchive 中实现下面的虚函数bool isCaseSensitive(void)
void load()
void unload()
DataStreamPtr open(const String& filename)
StringVectorPtr list(bool recursive = true )
FileInfoListPtr listFileInfo(bool recursive = true )
StringVectorPtr find(const String& pattern, bool recursive = true)
FileInfoListPtr findFileInfo(const String& pattern, bool recursive = true)
bool exists(const String& filename)
void unload()
DataStreamPtr open(const String& filename)
StringVectorPtr list(bool recursive = true )
FileInfoListPtr listFileInfo(bool recursive = true )
StringVectorPtr find(const String& pattern, bool recursive = true)
FileInfoListPtr findFileInfo(const String& pattern, bool recursive = true)
bool exists(const String& filename)
3. 继承Ogre::DataStream 派生出新的, 假设派生出 Ogre::XXXDataStream
4. Ogre::XXXDataStream 中实现下面的虚函数
size_t read(void* buf, size_t count);
void skip(long count);
void seek( size_t pos );
size_t tell(void) const;
bool eof(void) const;
void close(void);
void skip(long count);
void seek( size_t pos );
size_t tell(void) const;
bool eof(void) const;
void close(void);
5. 继承 Ogre::ArchiveFactory 派生出新的, 假设派生出 Ogre::XXXArchiveFactory
6. Ogre::XXXArchiveFactory 中实现下面虚函数
const String& getType(void) const
Archive* createInstance( const String& name )
Archive* createInstance( const String& name )
7. 在OgreRoot.h 中注册我们新的资源包的加载
在private成员中加入一个新的变量
ArchiveFactory *mXXXArchiveFactory;
代表你新的资源包的创建工厂
8. 在OgreRoot.cpp 中加入相关代码
在
mZipArchiveFactory = new ZipArchiveFactory();
ArchiveManager::getSingleton().addArchiveFactory( mZipArchiveFactory );
ArchiveManager::getSingleton().addArchiveFactory( mZipArchiveFactory );
两句代码的下面加上,注册我们资源包的代码
mXXXArchiveFactory = new XXXArchiveFactory();
ArchiveManager::getSingleton().addArchiveFactory( mXXXArchiveFactory );
ArchiveManager::getSingleton().addArchiveFactory( mXXXArchiveFactory );
关于XXXArchive, 和 XXXDataStream 的编写,可以参照 ZipArchive 和 ZipDataStream 照葫芦画瓢来做。