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(20);
    //在调试输出区域就可以看到,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(14.156f).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", 30);
    label1->setPosition(ccp(200, 200));

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

    //创建 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 = 1; i <= 100; i++)
    {
        //连接名称字符串
        std::string name = "Jepson" + Value(i).asString();

        //创建label对象
        Label* lab = Label::create(name, "Arial", 30);

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

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

Map 与 Vector 对比

Vector 保存对象,是按顺序的,获取对象,只能通过下标方式获取。
而 Map 保存对象,没有顺序,只保存了 key 和 value,通过 key 来获得 value。而且,Map 的 key 可以是任意类型,非常的方便。

你可能感兴趣的:(cocos2d-x)