文档章节

Cocos2d-x3.0模版容器详解之三:cocos2d::Value

_子墨
 _子墨
发布于 2014/08/15 00:52
字数 813
阅读 446
收藏 1

1.概述

  • 版本: v3.0 beta

  • 语言: C++


定义在 “COCOS2DX_ROOT/cocos/base” 路径下的 "CCValue.h" 的头文件中。

class Value;

unioncocos2d::Valie 是一个包含了很多原生类型(int,float,double,bool,unsigned char,char* 和 std::string)外加 std::vector<Value>, std::unordered_map<std::string,Value> 和 std::unordered_map<int,Value> 的类。

你可以把所有上面的提及的原生类型放入 cocos2d::Value 对象中,然后将它们转化为对应的原生类型,反之亦然。
在内部,cocos2d::Value 使用了一个联合变量来保存各种原生类型,这样可以节省很多的内存空间。
在 Cocos2d-x v3.0 beta 之前,存在着一些原生类型的封装类,如 CCBool, CCFloat, CCDouble, CCinteger,这些将会被弃用。
注意:当你在处理原生类型和容器的时候,请使用 cocos2d::Vector<T>,cocos2d::Map<K,V> 和 cocos2d::Value。

2.内存管理

cocos2d::Value 的内存是由它自己的析构函数自动处理的。所以当处理 cocos2d::Value 的内存时请坚持以 c++ 内存管理规则进行最佳实践。
cocos2d::Value 类包含了以下的数据成员:

{
     unsigned char byteVal;
     int intVal;
     float floatVal;
     double doubleVal;
     bool boolVal;
}_baseData;
  
std::string _strData;
ValueVector* _vectorData;
ValueMap* _mapData;
ValueMapIntKey* _intKeyMapData;
  
Type _type;


从代码片段可以看到,_baseData,_strData 和 _type 数据成员的内存是由编译器和她们的析构函数自动处理的。cocos2d::Value 的析构函数负责释放所有指针成员变量的资源(_vectorData,_mapData 和 _intKeyMapData)。
警告: cocos2d::Value 不再像其他的 cocos2d 类一样使用 retain/release和引用计数内存管理。

3.基本用法

cocos2d::Value 的用法是非常简单的。
这里提供一个简单的示例:

Value val;               // 调用默认构造函数
if(val.isNull()) 
{
   log("val is null");
}
else{
   std::string str =val.getDescription();
   log("The description of val0:%s",str.c_str());
}
//----------------------------------------------------
Value val1(65);               // 用一个 int 初始化
//Value val1(3.4f);   // 用一个 float 初始化
//Value val1(3.5);   // 用一个 double 初始化
log("The description of the integer value:%s" ,val1.getDescription().c_str());
log("val1.asByte() = %c" ,val1.asByte());
//----------------------------------------------------
std::string strV = "string";
Value val2(strV);               // 用 string 初始化
log("The description of the string value:%s" ,val2.getDescription().c_str());
//----------------------------------------------------
auto sp0 = Sprite::create();
Vector<Object*>* vecV = new Vector<Object*>();
vecV->pushBack(sp0);
Value val3(vecV);               // 用 Vector 初始化
log("The description of the Vector value:%s" ,val3.getDescription().c_str());
delete vecV;
//----------------------------------------------------
Map<std::string, Object*>* mapV = new Map<std::string, Object*>();
mapV->insert(strV,sp0);
Value val4(mapV);               // 用 Map 初始化
log("The description of the Map value:%s" ,val4.getDescription().c_str());
delete mapV;
//----------------------------------------------------
Value val6(&val4);               // 用 Map 初始化
log("The description of the Value-type value:%s" ,val6.getDescription().c_str());
//----------------------------------------------------
val2 = val1;               // 在两个不同指类型间赋值
log("operator-> The description of val2:%s" ,val2.getDescription().c_str());
val2 = 4;               // 直接赋值
log("operator-> The description of val4:%s" ,val2.getDescription().c_str());

输出:

cocos2d: val is null
cocos2d: The description of the integer value:
65
  
cocos2d: val1.asByte() = A
cocos2d: The description of the string value:
string
  
cocos2d: The description of the Vector value:
true
  
cocos2d: The description of the Map value:
true
  
cocos2d: The description of the Value-type value:
true
  
cocos2d:             operator             -> The description of val2:
65
  
cocos2d:             operator             -> The description of val4:
4


4.最佳实践

  • 偏向于使用 cocos2d::Value 和新模版容器(cocos2d::Vector<T> 和 cocos2d::Map<K,V>)而不是使用 cocos2d::CCBool,cocos2d::CCFloat,cocos2d::CCDouble,cocos2d::CCString,cocos2d::CCInteger 和旧 Objective-c 风格容器(cocos2d::CCArray 和 cocos2d::CCDictionary)。
    当你想要处理原生类型集合的时候,用 cocos2d::Value 封装原生类型,然后用新的模版容器 cocos2d::Vector<T> 和 cocos2d::Map<K,V> 组合它们。


本文转载自:http://www.cocoachina.com/bbs/read.php?tid=200034

_子墨
粉丝 48
博文 157
码字总数 141425
作品 0
深圳
iOS工程师
私信 提问
Cocos2d-x3.0模版容器详解之二:cocos2d::Map

1.概述 版本: v3.0 beta 语言: C++ 定义在 “COCOS2DXROOT/cocos/base” 路径下的 "CCMap.h" 的头文件中。 ? cocos2d::Map<K,V> 是一个内部使用了 std::unorderedmap的关联容器模版。 std::u......

_子墨
2014/08/15
99
0
Cocos2d-x3.0模版容器详解之一:cocos2d::Vector

1.概述 版本:v3.0 beta 语言:C++ 定义在 “COCOS2DXROOT/cocos/base” 路径下的 "CCVector.h" 的头文件中。 ? cocos2d::Vector<T> 是一个封装了动态大小的数组的顺序型容器。 它的元素是连...

_子墨
2014/08/15
112
0
Cocos2d-x3.0游戏实例《别救我》目录

这个5.1假期还真不错,有个小惊喜,那就是,我某个游戏今天的下载量爆表了,突破历史最高点~! 于是,我决定写一个新的游戏实例教程,以示庆祝~ 啊才怪啊~!这教程5.1之前就在写了,我还因此...

musicvs
2014/05/07
0
0
Cocos2d-x3.0游戏实例之《别救我》第一篇——前言

我们能学到什么? 这是一个很简单的游戏,但是用到的东西比较多(对新手而言),起码,对于一个实例来说,它涉及的确实有点多。 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地...

musicvs
2014/05/07
0
0
【2dx】使用2dx 3.0 制作打地鼠游戏(第一部分)

此教程来自于子山龙人的cocos2d版本 http://www.cnblogs.com/zilongshanren/archive/2011/05/15/2045784.html 子山龙人的教程是属于cocos2d版本的 现在边学学做成cocos2d-x3.0版本 本例子的g...

包灬子
2014/05/03
938
0

没有更多内容

加载失败,请刷新页面

加载更多

Activity启动模式二

上篇文章Activity启动模式一主要介绍了Activity的四种启动模式,这些启动模式都是在AndroidManifest中进行配置的。除此之外,Android系统还通过Intent类提供了一些标志位,同样可以指定Activ...

ltlovezh
48分钟前
6
0
三原色还原

1、Color Filter Array — CFA 随着数码相机、手机的普及,CCD/CMOS 图像传感器近年来得到广泛的关注和应用。 图像传感器一般都采用一定的模式来采集图像数据,常用的有 BGR 模式和 CFA 模式...

天王盖地虎626
59分钟前
7
0
kubernetes pod exec接口调用

正文 一般生产环境上由于网络安全策略,大多数端口是不能为集群外部访问的。多个集群之间一般都是通过k8s的ApiServer组件提供的接口通信,如https://192.168.1.101:6443。所以在做云平台时,...

码农实战
今天
8
0
3_数组

3_数组

行者终成事
今天
8
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部