四句话,两张图,一段代码
一、四句话
1. 文件加载器虚基类 UT_FileLoader
2. 从 UT_FileLoader 派生几个类
3. 文件加载器列表类 UT_MultiFileLoader,列表中可以动态增减 UT_FileLoader 的派生类
4. UT_FileManager 有个 UT_MultiFileLoader 成员变量
二、两张图:
三、一段代码
/************************************************************************/
/* UT_FileLoader.h */
/************************************************************************/
#pragma once
#include
#include "UT_FileBlock.h"
/************************************************************************/
//< 文件加载器基类
class UT_FileLoader
{
public:
enum /*Type*/
{
FLDT_Na = 0x00,
FLDT_System = 0x01,
FLDT_Package = 0x02,
FLDT_Downloader = 0x04,
FLDT_All = 0xff,
};
public:
virtual bool loadFile(const char * file_name, UT_FileOpenBlock & fb) = 0;
virtual bool findFile(const char * file_name) = 0;
virtual int getType(void) = 0;
virtual ~UT_FileLoader() {}
};
/************************************************************************/
//< 文件加载器列表
class UT_MultiFileLoader
{
public:
virtual ~UT_MultiFileLoader();
bool loadFile(const char * file_name, UT_FileOpenBlock & fb, int affinity = UT_FileLoader::FLDT_All);
bool findFile(const char * file_name, int affinity = UT_FileLoader::FLDT_All);
public:
void addLoaders(UT_FileLoader * fld);
void delAllLoaders();
size_t count(void) { return d_loaders.size(); }
private:
typedef std::vector
FileLoaderList;
FileLoaderList d_loaders;
};
/************************************************************************/
/* UT_FileLoader_Impl.h */
/************************************************************************/
#pragma once
#include "UT_FileLoader.h"
/************************************************************************/
class UT_CrtFileLoader : public UT_FileLoader
{
public:
virtual bool loadFile(const char * file_name, UT_FileOpenBlock & fb);
virtual bool findFile(const char * file_name);
virtual int getType(void) { return FLDT_System; }
public :
UT_CrtFileLoader( const char* csRootPath );
virtual ~UT_CrtFileLoader();
};
/************************************************************************/
class Package;
class UT_PkgFileLoader : public UT_FileLoader
{
public:
virtual bool loadFile(const char * file_name, UT_FileOpenBlock & fb);
virtual bool findFile(const char * file_name);
virtual int getType(void) { return FLDT_Package; }
public :
UT_PkgFileLoader( const char* csFileName );
virtual ~UT_PkgFileLoader();
bool IsOpened(void) { return m_bOpened; }
private :
bool m_bOpened;
Package * m_pkPackage;
};
/************************************************************************/
class IDownloader;
class UT_DownloaderFileLoader : public UT_FileLoader
{
public:
virtual bool loadFile(const char * file_name, UT_FileOpenBlock & fb);
virtual bool findFile(const char * file_name);
virtual int getType(void) { return FLDT_Downloader; }
public :
UT_DownloaderFileLoader( IDownloader * lder );
virtual ~UT_DownloaderFileLoader();
private :
IDownloader * m_pkDlder;
};
/************************************************************************/
/* UT_FileBlock.h */
/************************************************************************/
#pragma once
//< 内存块
class UT_FileOpenBlock
{
protected:
void * d_data;
unsigned d_size;
public:
UT_FileOpenBlock()
: d_data(0)
, d_size(0)
{}
UT_FileOpenBlock(void * d, unsigned s)
: d_data(d)
, d_size(s)
{}
operator bool() { return d_data != 0; }
bool opened() const { return d_data != 0; }
void * data() { return d_data; }
const void *data() const { return d_data; }
unsigned size() const { return d_size; }
void set(void * d, unsigned s) {
d_data = d;
d_size = s;
}
void letgo(void) {
d_data = 0;
d_size = 0;
}
};
//< 注:UT_FileOpenBlock没有释放内存块的函数,可以根据实际情况自行定义,因为游戏程序中可能会自定义内存分配接口。
这样设计的好处是:
1. 你可以随时调整各FileLoader的顺序,以决定优先从哪里读取文件
2. 而且代码的版式比较清楚,不会揉成一坨,容易维护