为手头游戏项目写编器,关联编器和游戏中的游戏对象的属性成了一个不小的问题,经过多经改写总算有一个相对好点的方案了,如果大家有更好的解决方案,请指点:
myProperty.h
[cpp]
// 王智泉
#ifndef __myProperty__H__
#define __myProperty__H__
#include
#include
// @注意: 以下的宏只能在CPP文件中使用
/* 定义一个属性
@param ownerClass: 宿主类
@param propertyName: 属性名
@param bindVar: 邦定的变量
@param defaultVal: 默认值
@param describe: 描述
**/
// =================================================================
#define myDEF_PROPERTY(ownerClass, propertyName, bindVar, describe)\
class ownerClass##bindVar##Pty : public myProperty\
{\
public:\
ownerClass##bindVar##Pty():myProperty(propertyName, describe){}\
virtual void setter(myPropertySet* owner, const std::string& val)\
{\
str2val(val, &(static_cast
}\
virtual std::string getter(const myPropertySet* owner)\
{\
return val2str(static_cast
}\
virtual std::string getValueType(const myPropertySet* owner)\
{\
return getvalType( static_cast
}\
};\
static ownerClass##bindVar##Pty s_pty##ownerClass##bindVar;
// 清空属性可能的值
#define myClearPropertyPossVals(ownerClass, bindVar)\
s_pty##ownerClass##bindVar._possibleva l.clear();
// 为属性增加可选的值
#define myAddPropertyPossVal(ownerClass, bindVar, possibleva l)\
s_pty##ownerClass##bindVar._possibleva l.push_back(possibleva l);
/* 注册属性
@param ownerClass: 类名
@param propertyName: 属性名
**/
#define myRegisterProperty(ownerClass, bindVar)\
registerProperty_impl(&s_pty##ownerClass##bindVar);\
s_pty##ownerClass##bindVar._defaultVal = s_pty##ownerClass##bindVar.val2str(bindVar);
// 属性类
// =====================================================================
class myPropertySet;
class myProperty
{
public:
/* 构造函数
@param name: 属性名
@param valType: 数据类型
@param describe: 描述
**/
myProperty(const std::string& name, const std::string& describe)
: _name(name)
, _describe(describe)
{}
virtual ~myProperty(){}
/* 设置属性
@param owner: 该属性的宿主(myPorpertySet的子类)
@param val: 该属性对应的值
**/
virtual void setter(myPropertySet* owner, const std::string& val) = 0;
/* 获得属性
@param owner: 该属性的宿主(myPorpertySet的子类)
**/
virtual std::string getter(const myPropertySet* owner) = 0;
/* 获得属性的数据类型
@param owner: 宿主
@return: 返回数据类型的名称(int, float, bool, string, ...)
**/
virtual std::string getValueType(const myPropertySet* owner) = 0;
public:
// 将字符串转化成其它类型
void str2val(const std::string& str, int* val) { *val = atoi(str.c_str());}
void str2val(const std::string& str, float* val){ *val = (float)atof(str.c_str()); }
void str2val(const std::string& str, bool* val){ *val = str == "TRUE"; }
void str2val(const std::string& str, std::string* val){ *val = str; }
// 奖其它类型转化成字符串
std::string val2str(int val) {char str[128] = {0}; sprintf(str, "%d", val); return str; }
std::string val2str(float val) {char str[128] = {0}; sprintf(str, "%.2f", val); return str; }
std::string val2str(bool val) { return val "TRUE" : "FALSE"; }
std::string val2str(const std::string& val){ return val; }
std::string val2str(double val){ return val2str((float)val); }
// 获得属性的数据类型
std::string getvalType(int val) {return "int";}
std::string getvalType(floa