游戏文件系统设计

四句话,两张图,一段代码


一、四句话

    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. 而且代码的版式比较清楚,不会揉成一坨,容易维护



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值