news 2026/9/1 15:31:47

【2014-09-02】cocos2dx-Lua学习笔记:CCLuaValue

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【2014-09-02】cocos2dx-Lua学习笔记:CCLuaValue

[历史归档]本文原发布于 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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 15:28:23

超薄嵌入式冰箱如何选?从底部散热到双循环的工程逻辑

家电圈最近有个现象值得关注&#xff1a;大容量冰箱越卖越好&#xff0c;但很多人的厨房却放不下。传统对开门、法式多门冰箱动辄 700 毫米往上的机身宽度&#xff0c;加上必须预留的散热缝&#xff0c;硬生生把很多小户型厨房的改造方案堵死了。于是我注意到一个新趋势——超薄…

作者头像 李华
网站建设 2026/9/1 15:23:28

Office免费安装与激活:官方合法途径全解析与实操指南

这类工具最值得先看的不是功能列表&#xff0c;而是能不能在普通环境里稳定跑起来。对于“Office全家桶免费安装与激活”这个话题&#xff0c;核心要解决的是在个人学习或非商业用途场景下&#xff0c;如何合规、稳定地获取并使用Office套件。很多人一上来就找各种“一键激活”…

作者头像 李华
网站建设 2026/9/1 15:22:26

2024小红书iOS笔试深度复盘:底层原理与实战避坑全解析

2024年春招&#xff0c;小红书iOS开发岗第三批笔试我完整走了一轮。说实话&#xff0c;动笔之前我以为是常规的八股题堆砌&#xff0c;真坐到电脑前才发现&#xff0c;这份卷子几乎是把iOS开发者在日常工作中会踩到的坑铺开当考题用。整场笔试涉及OC和Swift的底层原理、内存管理…

作者头像 李华
网站建设 2026/9/1 15:20:19

Replit免费模式解析:从在线IDE到AI云开发环境

很多开发者第一次接触 Replit&#xff0c;并不是因为在技术社区看到什么热度话题&#xff0c;而是因为一个很现实的场景&#xff1a;想临时跑一段 Python 脚本&#xff0c;或者想给同学演示一个小项目&#xff0c;结果本地环境折腾了半个小时。 装 Python、配虚拟环境、处理依…

作者头像 李华
网站建设 2026/9/1 15:20:11

MKVToolNix:无损音视频封装与轨道编辑的免费开源利器

这次我们来看一个本地音视频处理工具——MKVToolNix。它不是AI模型&#xff0c;而是一个功能强大、完全免费且开源的MKV&#xff08;Matroska&#xff09;多媒体容器编辑工具套件。对于经常需要处理视频封装、音轨合并、字幕添加或章节编辑的用户来说&#xff0c;这是一个能解决…

作者头像 李华
网站建设 2026/9/1 15:17:48

隐私问题引众怒,得州州长冻结超3000万美元Flock摄像头资金投入

得州冻结Flock摄像头资金投入&#xff0c;超3000万花费引关注随着公众对Flock人工智能监控摄像头的反对声日益高涨&#xff0c;得克萨斯州州长格雷格阿博特已冻结该州对这些摄像头的资金投入。这一举措是在《得克萨斯论坛报》的一项调查公布之前做出的&#xff0c;该调查显示&a…

作者头像 李华