Cocos2dx遊戲教程(十九):容器Value,Vector,Map

上一節提到了緩存的相關容器,那麼下面具體介紹下cocos2dx 3.x中的容器類型吧

一、Value

Value是什麼?初次看到不禁會產生疑問。源碼是最好的老師,我們來看一下它具體做了什麼吧。

文件所在位置: cocos2d-x-XXX/cocos/base/CCValue.h

打開後我們可以看到如下的定義

class CC_DLL Value
{
public:
    //一個預定義的空值,暫時還不知道其作用
    static const Value Null;

   //枚舉類,封裝所有的數據類型名
    enum class Type
    {
        /// no value is wrapped, an empty Value
        NONE = 0,
        /// wrap byte
        BYTE,
        /// wrap integer
        INTEGER,
        /// wrap unsigned
        UNSIGNED,
        /// wrap float
        FLOAT,
        /// wrap double
        DOUBLE,
        /// wrap bool
        BOOLEAN,
        /// wrap string
        STRING,
        /// wrap vector
        VECTOR,
        /// wrap ValueMap
        MAP,
        /// wrap ValueMapIntKey
        INT_KEY_MAP
    };

private:
    //用共用體封裝多種數據類型 保存Value的值,極大的節省了空間    
    union
    {
        unsigned char byteVal;
        int intVal;
        unsigned int unsignedVal;
        float floatVal;
        double doubleVal;
        bool boolVal;

        std::string* strVal;
        ValueVector* vectorVal;
        ValueMap* mapVal;
        ValueMapIntKey* intKeyMapVal;
    }_field;

    //記錄當前Value內保存的數據類型
    Type _type;
}

cocos2d::Value是一個模板容器類,完成了對很多數據類型的封裝。如原生類型int, float, char, char*, bool,以及string,map,vector等stl模板類。
Value極大的方便了cocos2dx工程裏各種數據類型之間的轉換。我們可以很同意的將不同數據類型轉換爲Value,反之亦然。

我麼可以直接使用Value的構造函數,傳入任意支持的類型,都會正確構造出想要的對象,而且還提供了整數、浮點型和字符串之間的轉換,如
整型轉爲字符串: std::string str = “NO”+Value(1).asString();
字符串轉爲整型:log("%d",Value(“1234”).asInt())
浮點型轉字符串:log("%s",Value(123.5f).asString().c_str())
字符串轉浮點型:log("%f",Value(“14.45”).asFloat())

二、Vector

std::vector大家應該都比較熟悉了,那麼Cocos2d::Vector是什麼呢?

Vector是一個封裝好的能動態增長順序訪問的容器。它的低層實現數據結構是標準模版庫中的標準順序容器std::vector。

主要使用的函數說明:
size():Vector大小
at(index):返回Vector下標爲index的對象
pushBack(object):在Vector的最後加入一個object對象
eraseObject(object):從Vector中移除object對象
erase(index):從Vector中移除下標爲index的對象
clear():清空Vector

怎樣遍歷Vector

for(auto obj : vector){
}

是不是就明白啦~~~

三、Map

Map是一個存儲鍵值對的關聯式容器,它能夠通過它們的鍵高速檢索相應的值。和std::map很類似哦~~
主要函數:
insert(key,value):向Map中插入一個對象。
at(key):返回Map中keyword爲key的對象
怎樣遍歷Map?

mapKeyVec = map1.keys();
for(auto key : mapKeyVec)
{
    auto spTag = map1.at(key)->getTag();
    log("The Sprite tag = %d, MAP key = %s",spTag,key.c_str());
    log("Element with key %s is located in bucket %zd",key.c_str(),map1.bucket(key));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章