由於資料保護的需要,一款遊戲一般都會有自己專屬的資源套件,這樣做既有利於智慧財產權的保護,又減少了磁碟片段的產生。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)
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);
5. 繼承 Ogre::ArchiveFactory 派生出新的, 假設派生出 Ogre::XXXArchiveFactory
6. Ogre::XXXArchiveFactory 中實現下面虛函數
const String& getType(void) const
Archive* createInstance( const String& name )
7. 在OgreRoot.h 中註冊我們新的資源套件的載入
在private成員中加入一個新的變數
ArchiveFactory *mXXXArchiveFactory;
代表你新的資源套件的建立工廠
8. 在OgreRoot.cpp 中加入相關代碼
在
mZipArchiveFactory = new ZipArchiveFactory();
ArchiveManager::getSingleton().addArchiveFactory( mZipArchiveFactory );
兩句代碼的下面加上,註冊我們資源套件的代碼
mXXXArchiveFactory = new XXXArchiveFactory();
ArchiveManager::getSingleton().addArchiveFactory( mXXXArchiveFactory );
關於XXXArchive, 和 XXXDataStream 的編寫,可以參照 ZipArchive 和 ZipDataStream 照葫蘆畫瓢來做。