天天看點

Cocos2d-x3.0 新成員Value,Vector,Map詳解

Value

Value,代表值,可以存放“任意”類型的值,當然“任意”有一定範圍。F12轉到定義。

class CC_DLL Value
{
public:
    static const Value Null;

    Value();
    explicit Value(unsigned char v);
    explicit Value(int v);
    explicit Value(float v);
    explicit Value(double v);
    explicit Value(bool v);
    explicit Value(const char* v);
    explicit Value(const std::string& v);

    explicit Value(const ValueVector& v);
    explicit Value(ValueVector&& v);

    explicit Value(const ValueMap& v);
        explicit Value(ValueMap&& v);

    explicit Value(const ValueMapIntKey& v);
    explicit Value(ValueMapIntKey&& v);

    Value(const Value& other);
    Value(Value&& other);
    ~Value();
           

我們可以看到 Value 的所有構造函數,它可以表示很多種值,int,float,double,bool,char….等等。

使用方法如下:

//Value的使用,這裡是字元串類型,和Int類型兩種
    Value valStr = Value("Hello,Jepson");
    Value valInt = Value();
    //在調試輸出區域就可以看到,Hello,Jepson20,可以看到Value非常的好用
    log("%s%d", valStr.asString().c_str(), valInt.asInt());
           

在建立Value時,我們調用構造函數,需要傳入一個值,Value類會根據傳入的值自動比對類型,通過調用as…函數來擷取,比如上面的,擷取 Int 類型的,valInt.asInt(),擷取 String 類型的,valStr.asString()。(c_str()函數傳回一個指向正規C字元串的指針, 内容與本string串相同)。

另外value在字元串和數字類型之間的轉換也非常的友善,雖然c++中也提供了,但value明顯看起來舒服多了。

例如:

log("%d", Value("1314").asInt());     //放入字元串1314,輸出int類型 1314
    log("%f", Value("14.15").asFloat());     //放入字元串1314,輸出float類型 14.15

    log("%s", Value(f).asString().c_str());     //放入float類型 14.156f,輸出字元串類型 14.156
           

Vector

Vector, 是隊列,封裝了C++的 vector 容器類。可以按順序存放很多個對象,會限制存放的對象類型。

Vector常用函數:

  • size(),傳回 Vector 存放的對象個數
  • at(index),傳回 Vector 存放的某個對象,index為下标值
  • front(),傳回 Vector 第一個對象
  • back(),傳回 Vector 最後一個對象
  • pushBack(object),在 Vector 最後添加一個object對象
  • eraseObject(object),從 Vector 中删除object對象
  • erase(index),從 Vector 中删除下标為index的對象
  • clear(),清空 Vector,删除所有對象

Vector 使用方法如下:

//Vector的使用
    //建立兩個小 Jepson label
    Label* label1 = Label::create("Jepson1", "Arial", );
    label1->setPosition(ccp(, ));

    Label* label2 = Label::create("Jepson2", "Arial", );
    label2->setPosition(ccp(, ));

    //建立 Vector 對象,類型Label*
    Vector<Label*> vec;

    //把 2個 Label 存放到Vector 中
    vec.pushBack(label1);
    vec.pushBack(label2);

    //從 vec隊列 中拿出 lab 并添加到層中
    for (auto lab : vec)
    {
        this->addChild(lab);
    }
           

Map

Map 有一個 key,可以通過 key 來定位到每一個儲存在 Map中的value,可以使管理非常的清晰。

Map使用方法如下

//Map的使用-對号入座 Map
    //建立 Map 對象,Map<int, Label*>表示使用int類型作為key值,使用Label類型作為value值
    Map<int, Label*> jepsonMap;

    //建立100個Jepson,并儲存到Map中
    for (int i = ; i <= ; i++)
    {
        //連接配接名稱字元串
        std::string name = "Jepson" + Value(i).asString();

        //建立label對象
        Label* lab = Label::create(name, "Arial", );

        //将JepsonLabel 儲存到 Map中,用i作為key,用lab作為value
        jepsonMap.insert(i, lab);
    }

    //取出 52 号 Jepson,  at(index) 傳回對象
    Label* jepsonLab = jepsonMap.at();
    jepsonLab->setPosition(ccp(, ));
    this->addChild(jepsonLab);
           

Map 與 Vector 對比

Vector 儲存對象,是按順序的,擷取對象,隻能通過下标方式擷取。

而 Map 儲存對象,沒有順序,隻儲存了 key 和 value,通過 key 來獲得 value。而且,Map 的 key 可以是任意類型,非常的友善。