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

1.概述

  • 版本: v3.0 beta
  • 语言: C++

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

?


1

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 类包含了以下的数据成员:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

{

     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 的用法是非常简单的。
这里提供一个简单的示例:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

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());

输出:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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
时间: 2024-09-15 09:23:45

转 Cocos2d-x3.0模版容器详解之三:cocos2d::Value的相关文章

Cocos2d-x3.0模版容器详解之二:cocos2d::Map&lt;K,V&gt;

1.概述 版本: v3.0 beta 语言: C++ 定义在 "COCOS2DX_ROOT/cocos/base" 路径下的 "CCMap.h" 的头文件中. ? 1 2 template         <         class         K,         class         V> class         CC_DLL Map; cocos2d::Map<K,V> 是一个内部使用了 std::unordered_

转 Cocos2d-x3.0模版容器详解之一:cocos2d::Vector&lt;T&gt;

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

C++的array数组容器详解

数组容器, 是存储数组的容器, 是C类型数组的扩充, 可以使用迭代器进行操作; 例如"std::array<int, 5>", 需要注意的是, 如果直接进行赋值, "std::array<int, 5> ia = {1, 2, 3, 4, 5}; " 在GCC下会有警告: "missing braces around initializer for 'std::array<int, 5u>::value_type [5]

C++中“tuple”(元组)容器详解

tuple容器(元组), 是表示元组容器, 是不包含任何结构的,快速而低质(粗制滥造, quick and dirty)的, 可以用于函数返回多个返回值; tuple容器, 可以使用直接初始化, 和"make_tuple()"初始化, 访问元素使用"get<>()"方法, 注意get里面的位置信息, 必须是常量表达式(const expression); 可以通过"std::tuple_size<decltype(t)>::valu

SPL3.0数据连接详解

数据|详解 SPL3.0数据连接详解 SPL3.0数据支持能力 SPL3.0在数据连接方面作了很大的改进,使用多种方式对多种数据库进行连接访问,让用户有了更多的选择, 支持的数据库有:SQL Server .Access.Oracle.其他ODBC连接 支持的连接方式有: 用System.Data.SqlClient访问SQL Server 用System.Data.OleDb访问Access和Oracle 用System.Data.Odbc访问SQL Server.Oracle等其他ODBC连

Android5.0新特性详解之全新的动画_Android

 在Material Design设计中,为用户与app交互反馈他们的动作行为和提供了视觉上的连贯性.Material主题为控件和Activity的过渡提供了一些默认的动画,在android L上,允许自定义这些动画: Touch feedback 触摸反馈 Circular Reveal 圆形展示 Curved motion 曲线运动 View state changes 视图状态变化 Vector Drawables 矢量图动画 Activity transitions 活动转场 触摸反馈

Android 6.0权限申请详解及权限资料整理_Android

在android 6.0开始,部分的权限需要我们动态申请,也就是说当我们的打开app的时候系统不会主动像您申请app所需要的部分权限,需要客户在使用app的时候主动的去申请. 一.权限的申请两步骤: 1.权限申请: /** * @param permissions需要申请的权限 * @param requestCode申请回调code */ public static void requestPermissions(final @NonNull Activity activity,final @

IIS7.0 Appcmd 命令详解

IIS7.0 Appcmd 命令详解 废话不说!虽然有配置界面管理器!但是做安装包的时候命令创建是必不可少的!最近使用NSIS制作安装包仔细研究了一下Appcmd的命令,可谓是功能齐全. 上网查了些资料,那些博客大部分都是转载的别人的.都是些基本的介绍,很多命令都没介绍到(不知道是不是我走眼了). 就连微软的 技术资源库 也不详细: 附地址:http://technet.microsoft.com/zh-cn/library/cc772200(WS.10).aspx(反正我找了一遍!没找到我要的

Android5.0新特性详解之全新的动画

在Material Design设计中,为用户与app交互反馈他们的动作行为和提供了视觉上的连贯性.Material主题为控件和Activity的过渡提供了一些默认的动画,在android L上,允许自定义这些动画: Touch feedback 触摸反馈 Circular Reveal 圆形展示 Curved motion 曲线运动 View state changes 视图状态变化 Vector Drawables 矢量图动画 Activity transitions 活动转场 触摸反馈 触