VariableSystem是天龙的全局变量系统,使用的最大好处除了可以统一保存在文件中外,还可以统一管理全局变量,防止全局变量满天非的问题。
实现方式:
一 变量定义
struct
VARIABLE
{
STRING vValue; // 变量值
BOOL bTemp; // 临时变量
};
#ifdef __SGI_STL_PORT
typedef std::hash_map < STRING, VARIABLE > VARIABLE_MAP;
#else
typedef stdext::hash_map < STRING, VARIABLE > VARIABLE_MAP;
#endif
{
STRING vValue; // 变量值
BOOL bTemp; // 临时变量
};
#ifdef __SGI_STL_PORT
typedef std::hash_map < STRING, VARIABLE > VARIABLE_MAP;
#else
typedef stdext::hash_map < STRING, VARIABLE > VARIABLE_MAP;
#endif
可见变量是放在hash里面的,这样可以加快查找
二 变量保存
//
当前保存的变量
VARIABLE_MAP m_mapCurrent;
// 游戏退出时更改并保存的变量,以便下一次游戏启动生效
VARIABLE_MAP m_mapNeedSave;
VARIABLE_MAP m_mapCurrent;
// 游戏退出时更改并保存的变量,以便下一次游戏启动生效
VARIABLE_MAP m_mapNeedSave;
用处我就不介绍了,写的很清楚
实现方法就是:m_mapCurrent和m_mapNeedSave变量保存时,都会保存在同一个文件里面,下次游戏加载时,保存在游戏里面的变量都会加载到m_mapCurrent变量里面,就可以实现《游戏退出时更改并保存的变量,以便下一次游戏启动生效》
三 加入和取变量
//
得到某个变量的值,如果不存在,则返回FALSE
virtual BOOL GetVariable(LPCTSTR szName, STRING & strValue) ;
// 设置某个变量的值,如果不存在,则首先创建
virtual VOID SetVariable(LPCTSTR szName, LPCTSTR szValue, BOOL bTemp = TRUE, BOOL bFireEvent = TRUE) ;
// 设置某个变量的值,但并不马上生效, 下一次启动时才会生效
virtual VOID SetVariableDelay(LPCTSTR szName, LPCTSTR szValue) ;
// -------------------------------------------------------------------
// 快速设置通道
// 整数
virtual VOID SetAs_Int(LPCTSTR szName, INT nValue, BOOL bTemp = TRUE) ;
// 浮点数
virtual VOID SetAs_Float(LPCTSTR szName, FLOAT fValue, BOOL bTemp = TRUE) ;
// Vector2
virtual VOID SetAs_Vector2(LPCTSTR szName, FLOAT fX, FLOAT fY, BOOL bTemp = TRUE) ;
// -------------------------------------------------------------------
// 快速获取通道
// 字符串, DEF=""
virtual const STRING & GetAs_String(LPCTSTR szName, BOOL * bHave = NULL) ;
// 整数, DEF=0
virtual INT GetAs_Int(LPCTSTR szName, BOOL * bHave = NULL) ;
// 浮点数, DEF=0.0f
virtual FLOAT GetAs_Float(LPCTSTR szName, BOOL * bHave = NULL) ;
// Vector2, DEF=(0.0f, 0.0f)
virtual fVector2 GetAs_Vector2(LPCTSTR szName, BOOL * bHave = NULL) ;
virtual BOOL GetVariable(LPCTSTR szName, STRING & strValue) ;
// 设置某个变量的值,如果不存在,则首先创建
virtual VOID SetVariable(LPCTSTR szName, LPCTSTR szValue, BOOL bTemp = TRUE, BOOL bFireEvent = TRUE) ;
// 设置某个变量的值,但并不马上生效, 下一次启动时才会生效
virtual VOID SetVariableDelay(LPCTSTR szName, LPCTSTR szValue) ;
// -------------------------------------------------------------------
// 快速设置通道
// 整数
virtual VOID SetAs_Int(LPCTSTR szName, INT nValue, BOOL bTemp = TRUE) ;
// 浮点数
virtual VOID SetAs_Float(LPCTSTR szName, FLOAT fValue, BOOL bTemp = TRUE) ;
// Vector2
virtual VOID SetAs_Vector2(LPCTSTR szName, FLOAT fX, FLOAT fY, BOOL bTemp = TRUE) ;
// -------------------------------------------------------------------
// 快速获取通道
// 字符串, DEF=""
virtual const STRING & GetAs_String(LPCTSTR szName, BOOL * bHave = NULL) ;
// 整数, DEF=0
virtual INT GetAs_Int(LPCTSTR szName, BOOL * bHave = NULL) ;
// 浮点数, DEF=0.0f
virtual FLOAT GetAs_Float(LPCTSTR szName, BOOL * bHave = NULL) ;
// Vector2, DEF=(0.0f, 0.0f)
virtual fVector2 GetAs_Vector2(LPCTSTR szName, BOOL * bHave = NULL) ;
注:现在有个疑问,为何整数和浮点数都会保存在字符串里面,用的时候在把字符串还原过来,这样岂不是有开销,目的何在?