首页 > 代码库 > Cocos2d-x3.3利用TileMap绘制Polygon/PolyLine
Cocos2d-x3.3利用TileMap绘制Polygon/PolyLine
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。