Cocos2d-x3.3利用TileMap绘制PolygonPolyLine

Cocos2d-x3.3利用TileMap绘制PolygonPolyLine,第1张

概述转自: http://www.cnblogs.com/lucky-hugh/p/4119931.html tiled提供了多边形/折线的绘制, 在Cocos2dx3.3(不知道其他版本如何)中能够读取这些对象. 但是网上似乎没有Cocos2dx读取多边形/折线的相关教程. 今天尝试了PolyLine的绘制, 就在这里记录一下, 也希望能够帮到需要的人. 这里只介绍PolyLine的情况. Poly 转自:http://www.cnblogs.com/lucky-hugh/p/4119931.HTML

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(y10 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(23                 auto y  = -dicp.at(").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截图

绘制结果

在tilemap中,我不太清楚如何确定点的顺/逆时针方向,然而在Cocos2dx中利用3.x的API创建多边形是要求顺时针方向的.

这个给出凸多边形求顺/逆时针的方法:

转自http://www.oschina.net/question/437512_129417

关于如何判定多边形是顺时针还是逆时针对于凸多边形而言,只需对某一个点计算cross product = ((xi - xi-1),(yi - yi-1)) x ((xi+1 - xi),(yi+1 - yi))
= (xi - xi-1) * (yi+1 - yi) - (yi - yi-1) * (xi+1 - xi)
如果上式的值为正,逆时针;为负则是顺时针而对于一般的简单多边形,则需对于多边形的每一个点计算上述值,如果正值比较多,是逆时针;负值较多则为顺时针。

我根据这个写了判断代码:

bool LogicLayer::isClockwise(Vec2 p1,Vec2 p2,Vec2 p3){ if ( ((p2.x=p1.x) * (p3.y-p2.y) - (p2.y - p1.y ) * (p3.x - p2.x))>0 )为正则是逆时针 return false; else true;}

返回true时为顺时针.

如果结果为0 的情况是无法判断的.

总结

以上是内存溢出为你收集整理的Cocos2d-x3.3利用TileMap绘制Polygon/PolyLine全部内容,希望文章能够帮你解决Cocos2d-x3.3利用TileMap绘制Polygon/PolyLine所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1058239.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存