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对象然后按值索引得到我们需要的属性值.