cocos2d-x-3.0學習筆記之瓦片地圖的使用

cocos3.0對cocos2.00做了很多的改變與優化,如果直接將cocos2.0裏的遊戲代碼移植到cocos3.0中會報很多的錯誤。例如在獲取瓦片地圖的屬性時更會如此。下面做個例子,首先我們將製作好的瓦片地圖加載到程序中

auto m_map = TMXTiledMap::create("MarioMap.tmx");
this->addChild(m_map);

加載好瓦片地圖之後,我們如何得到瓦片地圖的屬性
這裏寫圖片描述
例如我們想得到enemy對象的x、y坐值
首先我們需要得到這個瓦片對象層中的對組,幸運的是cocos給我們提供了一個按對象組名獲得對象組的api函數:
TMXObjectGroup* getObjectGroup(const std::string& groupName) const;
因此首先得到對象組objects:

TMXObjectGroup *group = m_map->getObjectGroup("objects");

得到對象組之後,我們要得到對象,在cocos2.0的版本中返回的對象爲CCArray組,因此可以直接這樣做

CCArray* objects = group->getObjects();
    CCObject* object
    CCARRAY_FOREACH(objects, object)
    {
        CCDictionary* dict = (CCDictionary*)object;
        if (dict->valueForKey("type")->m_sString =="mushroom")
        {
            const CCString* x = dict->valueForKey("x");
            const CCString* y = dict->valueForKey("y");

            break;
        }
    }

首先創建一個數組將從對象組裏得到的所有對象保存到數組裏,然後遍歷數組得到單個對象並將它轉化成字典,然後在字典中進行字符串的索引找到自己需要的屬性並得到它的值,得到的值爲一個String字符串,還要轉化成我們需要的float座標值。
在cocos3.0中,這種方法行不通,因爲TMXObjectGroup類的getObjects方法返回的不再是一個CCArray數組,而是一ValueVector。
因此需要這樣做。

ValueVector vectorObjects = group->getObjects();
    for (ValueVector::iterator iter = vectorObjects.begin();
        iter != vectorObjects.end(); iter++)
    {
        if (iter->asValueMap().at("type").asString() == "mushroom")
        {
            float x = object.at("x").asFloat();
            float y = object.at("y").asFloat();
            break;
        }

我們得到ValueVector對象然後按值索引得到我們需要的屬性值.
         
                                                                                                                                                                                          

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章