日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转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

總結

以上是生活随笔為你收集整理的转Cocos2d-x3.0模版容器详解之三:cocos2d::Value的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。