做一款像素游戏项目,需要读取TMX文件中的阻挡区域,生成box2d的fixture,来做阻挡 使用cocos2dx版本: 2.2.2
1.在tmx文件中创建一个"Physics"的层,用来存放编辑器中生成的各种阻挡块
编辑器中主要有polygone, polyline,box和circle4种,其实box也属于polygone
2.我的tiled map 版本Version 0.9.1
查看tmx文件,增加的层属于<Objectgroup>是不会被渲染的,所以添加多个层对效率也没有什么影响, 我们此处叫"Physics"
上图的4个图形,分别对应下图XML的4个<object></object>
polyline读取一个初始点x,y,然后读取一些列相对于初始点的偏移值
box读取x,y,width,height
circle读取起始点x,y,外加直径width(height)足以,因为无法构造椭圆的b2Shape,所以我们构造圆
polygon读取起始点x,y,然后读取一些列相对于初始点的偏移值,类似于polyline
3.cocos2dx中解析此文件的时CCTMXXMLParser.cpp 大概在623行,但是代码中只解析了polygon,polyline和circle处解析代码为空,我们在此处添加完全
else if (elementName == "polygon")
{
// find parent object's dict and add polygon-points to it
ObjectGroup* objectGroup = (ObjectGroup*)m_pObjectGroups->lastObject();
CCDictionary* dict = (CCDictionary*)objectGroup->getObjects()->lastObject();
// get points value string
const char* value = valueForKey("points", attributeDict);
if(value)
{
CCArray* pPointsArray = new CCArray;
// parse points string into a space-separated set of points
stringstream pointsStream(value);
string pointPair;
while(std::getline(pointsStream, pointPair, ' '))
{
// parse each point combo into a comma-separated x,y point
stringstream pointStream(pointPair);
string xStr,yStr;
char buffer[32] = {0};
CCDictionary* pPointDict = new CCDictionary;
// set x
if(std::getline(pointStream, xStr, ','))
{
int x = atoi(xStr.c_str()) + (int)objectGroup->getPositionOffset().x;
sprintf(buffer, "%d", x);
CCString* pStr = new CCString(buffer);
pStr->autorelease();
pPointDict->setObject(pStr, "x");
}
// set y
if(std::getline(pointStream, yStr, ','))
{
int y = atoi(yStr.c_str()) + (int)objectGroup->getPositionOffset().y;
sprintf(buffer, "%d", y);
CCString* pStr = new CCString(buffer);
pStr->autorelease();