[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2014-09-02| 标题:cocos2dx-Lua学习笔记:CCLuaValue|分类:编程 / C && C++ / cocos2dx |标签:C&&C++·cocos2dx·CCLuaValue
cocos2dx-Lua学习笔记:CCLuaValue
- 备注:
- CCLuaValue.h/cpp:
最近在学习cocos2dx和Lua的交互,这里笔记下学习心得。
备注:
1 作者对于Lua的使用较少,纯粹从使用出发,对它的理解较浅,可能有错误,还请路过的各位大牛多多指正。
2 本笔记代码部分参考cocos2dx2.2.3代码,代码版权归原作者所有。
3 由于作者时间,经验,能力有限,笔记可能不完整,以后随用随补充吧。
CCLuaValue.h/cpp:
NS_CC_BEGINtypedefintLUA_FUNCTION;typedefintLUA_TABLE;typedefintLUA_STRING;classCCLuaValue;//注意这里定义了CCLuaValueDict类型,其实就是一个hashmap。typedefstd::map<std::string,CCLuaValue>CCLuaValueDict;typedefCCLuaValueDict::const_iterator CCLuaValueDictIterator;//注意这里定义了CCLuaValueArray类型,其实就是一个list。typedefstd::list<CCLuaValue>CCLuaValueArray;typedefCCLuaValueArray::const_iterator CCLuaValueArrayIterator;//定义了CCLuaValue支持的数据类型typedefenum{CCLuaValueTypeInt,CCLuaValueTypeFloat,CCLuaValueTypeBoolean,CCLuaValueTypeString,CCLuaValueTypeDict,CCLuaValueTypeArray,CCLuaValueTypeCCObject}CCLuaValueType;//通过union来定义存储方式,可以简化大量的存储变量。typedefunion{intintValue;floatfloatValue;boolbooleanValue;std::string*stringValue;CCLuaValueDict*dictValue;CCLuaValueArray*arrayValue;CCObject*ccobjectValue;}CCLuaValueField;/** Lua support for cocos2d-x * @js NA * @lua NA */classCCLuaValue{public://各种静态工具类方法,直接返回一个CCLuaValue实例。staticconstCCLuaValueintValue(constintintValue);staticconstCCLuaValuefloatValue(constfloatfloatValue);staticconstCCLuaValuebooleanValue(constboolbooleanValue);staticconstCCLuaValuestringValue(constchar*stringValue);staticconstCCLuaValuestringValue(conststd::string&stringValue);staticconstCCLuaValuedictValue(constCCLuaValueDict&dictValue);staticconstCCLuaValuearrayValue(constCCLuaValueArray&arrayValue);staticconstCCLuaValueccobjectValue(CCObject*ccobjectValue,constchar*objectTypename);staticconstCCLuaValueccobjectValue(CCObject*ccobjectValue,conststd::string&objectTypename);//默认构造函数,默认类型为int,名称为NULL,值为NULLCCLuaValue(void):m_type(CCLuaValueTypeInt),m_ccobjectType(NULL){memset(&m_field,0,sizeof(m_field));}CCLuaValue(constCCLuaValue&rhs);CCLuaValue&operator=(constCCLuaValue&rhs);~CCLuaValue(void);//各种getconstCCLuaValueTypegetType(void)const{returnm_type;}conststd::string&getCCObjectTypename(void)const{return*m_ccobjectType;}//返回不同类型的值,因为存储结构为union,因此可以直接返回。intintValue(void)const{returnm_field.intValue;}floatfloatValue(void)const{returnm_field.floatValue;}boolbooleanValue(void)const{returnm_field.booleanValue;}conststd::string&stringValue(void)const{return*m_field.stringValue;}constCCLuaValueDict&dictValue(void)const{return*m_field.dictValue;}constCCLuaValueArray&arrayValue(void)const{return*m_field.arrayValue;}CCObject*ccobjectValue(void)const{returnm_field.ccobjectValue;}private:CCLuaValueField m_field;//定义了存储值CCLuaValueType m_type;//定义了存储类型std::string*m_ccobjectType;//定义了名称,这里只有在自定义类型中才有意义。voidcopy(constCCLuaValue&rhs);};NS_CC_END//===========================================================NS_CC_BEGIN//各种工具函数,快捷构造出CCLuaValue的实例constCCLuaValueCCLuaValue::intValue(constintintValue){CCLuaValue value;value.m_type=CCLuaValueTypeInt;value.m_field.intValue=intValue;returnvalue;}constCCLuaValueCCLuaValue::floatValue(constfloatfloatValue){CCLuaValue value;value.m_type=CCLuaValueTypeFloat;value.m_field.floatValue=floatValue;returnvalue;}constCCLuaValueCCLuaValue::booleanValue(constboolbooleanValue){CCLuaValue value;value.m_type=CCLuaValueTypeBoolean;value.m_field.booleanValue=booleanValue;returnvalue;}constCCLuaValueCCLuaValue::stringValue(constchar*stringValue){CCLuaValue value;value.m_type=CCLuaValueTypeString;//注意这里重新拷贝了一份,这样就和入参没有关系了value.m_field.stringValue=newstd::string(stringValue?stringValue:"");returnvalue;}constCCLuaValueCCLuaValue::stringValue(conststd::string&stringValue){CCLuaValue value;value.m_type=CCLuaValueTypeString;//注意这里重新拷贝了一份,这样就和入参没有关系了value.m_field.stringValue=newstd::string(stringValue);returnvalue;}constCCLuaValueCCLuaValue::dictValue(constCCLuaValueDict&dictValue){CCLuaValue value;value.m_type=CCLuaValueTypeDict;//注意这里重新拷贝了一份,这样就和入参没有关系了value.m_field.dictValue=newCCLuaValueDict(dictValue);returnvalue;}constCCLuaValueCCLuaValue::arrayValue(constCCLuaValueArray&arrayValue){CCLuaValue value;value.m_type=CCLuaValueTypeArray;//注意这里重新拷贝了一份,这样就和入参没有关系了value.m_field.arrayValue=newCCLuaValueArray(arrayValue);returnvalue;}//注意这里包装了自定义类型,需要传入一个名称。constCCLuaValueCCLuaValue::ccobjectValue(CCObject*ccobjectValue,constchar*objectTypename){CCLuaValue value;value.m_type=CCLuaValueTypeCCObject;value.m_field.ccobjectValue=ccobjectValue;ccobjectValue->retain();//retain一次//注意这里重新拷贝了一份,这样就和入参没有关系了value.m_ccobjectType=newstd::string(objectTypename);returnvalue;}constCCLuaValueCCLuaValue::ccobjectValue(CCObject*ccobjectValue,conststd::string&objectTypename){returnCCLuaValue::ccobjectValue(ccobjectValue,objectTypename.c_str());}CCLuaValue::CCLuaValue(constCCLuaValue&rhs){copy(rhs);}CCLuaValue&CCLuaValue::operator=(constCCLuaValue&rhs){if(this!=&rhs)copy(rhs);return*this;}//析构函数,删掉申请的内存CCLuaValue::~CCLuaValue(void){if(m_type==CCLuaValueTypeString){deletem_field.stringValue;}elseif(m_type==CCLuaValueTypeDict){deletem_field.dictValue;}elseif(m_type==CCLuaValueTypeArray){deletem_field.arrayValue;}elseif(m_type==CCLuaValueTypeCCObject){m_field.ccobjectValue->release();deletem_ccobjectType;}}//拷贝构造函数的实现为深拷贝,内存也重新申请一次。voidCCLuaValue::copy(constCCLuaValue&rhs){memcpy(&m_field,&rhs.m_field,sizeof(m_field));m_type=rhs.m_type;if(m_type==CCLuaValueTypeString){m_field.stringValue=newstd::string(*rhs.m_field.stringValue);}elseif(m_type==CCLuaValueTypeDict){m_field.dictValue=newCCLuaValueDict(*rhs.m_field.dictValue);}elseif(m_type==CCLuaValueTypeArray){m_field.arrayValue=newCCLuaValueArray(*rhs.m_field.arrayValue);}elseif(m_type==CCLuaValueTypeCCObject){m_field.ccobjectValue=rhs.m_field.ccobjectValue;m_field.ccobjectValue->retain();m_ccobjectType=newstd::string(*rhs.m_ccobjectType);}}NS_CC_END