标签:style blog http io ar color os 使用 sp
tiled提供了多边形/折线的绘制, 在Cocos2dx3.3(不知道其他版本如何)中能够读取这些对象. 但是网上似乎没有Cocos2dx读取多边形/折线的相关教程. 今天尝试了PolyLine的绘制, 就在这里记录一下, 也希望能够帮到需要的人. 这里只介绍PolyLine的情况. Polygon情况是类似的.
在CCTMXXMLParse.cpp中,有方法
void TMXMapInfo::startElement(void *ctx, const char *name, const char **atts)
找到else if (elementName == "polyline"), 即解析折线的情况
可以看到, 最后一行为dict["polylinePoints"] = Value(pointsArray);
即将解析得到的pointsArray以"polylinePoints"为key存储. 所以我们在第12行用该key获取储存points的ValueVector.
1 auto map = experimental::TMXTiledMap::create("map.tmx"); 2 //处理对象层 3 auto objectGroup = map->getObjectGroup("Object"); 4 auto objects = objectGroup->getObjects(); 5 for (auto object: objects) 6 { 7 auto dic= object.asValueMap(); 8 float objectX = dic.at("x").asFloat(); 9 float objectY = dic.at("y").asFloat(); 10 11 auto drawNode= DrawNode::create(); 12 auto pointsVector = dic.at("polylinePoints").asValueVector(); 13 auto size = pointsVector.size(); 14 //获取点 15 if (size>0) 16 { 17 Vec2* points= new Vec2[size]; 18 int i =0 ; 19 for (auto pointValue:pointsVector) 20 { 21 auto dicp = pointValue.asValueMap(); 22 auto x = dicp.at("x").asFloat(); 23 auto y = -dicp.at("y").asFloat();//y取负值 24 points[i]= Vec2( x , y ); 25 i++; 26 } 27 //绘制折线 28 drawNode->drawPoly(points,size,false,Color4F::RED); 29 delete[] points; 30 drawNode->setPosition(objectX,objectY); 31 this->addChild(drawNode,10); 32 } 33 }
第16行的代码似乎没有实际意义, 因为当对象不是PolyLine时会报错. 所以如果直接使用上面的代码的话, 在tiled中,PolyLine所在的对象层只能有PolyLine对象而不能有其他的对象.
或者在tiled中给PolyLine添加一个类型, 并在代码中进行判断.
tilemap截图
绘制结果
Cocos2d-x3.3利用TileMap绘制Polygon/PolyLine
标签:style blog http io ar color os 使用 sp
原文地址:http://www.cnblogs.com/lucky-hugh/p/4119931.html