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對象然後按值索引得到我們需要的屬性值.