您的位置:首页 > 其它

tiled map中折线的提取

2015-10-19 19:37 323 查看
在Tiled Map中,有时会利用折线规划路径,对折线路径上各点的提取就是关键

cocos2d引擎默认不能读取polyline的数据,先参考上一篇博文修改CCTMXTiledMap类的引擎代码。

tmx文件中关于polyline的数据如下:

<polyline points="0,0 2,107 114,107"/>

修改引擎后按关键字key="polyline"读取字典得到CCString类型的数据“0,0 2,107 114,107”,包含折线点的相对位置(注意这里的位置是相对于起始点的,起始点可以通过x,y关键字读取),相对位置的坐标原点在地图的左上角,与cocos2d的坐标方式不同,但是地图一旦被加入cocos2d中,起始点坐标就转换为OPENGL坐标,因此不用转化。

将CCString类型的数据“0,0 2,107 114,107”拆分的函数如下:

vector<CCPoint> point_dispatch(const string str)
{
bool comma_flag = false;
bool space_flag = false;
vector<CCPoint> point;
string x, y;
for (int i = 0; ; i++)
{
if (str[i] == ',')
{
comma_flag = true;
}
else if ((str[i] == ' ') || (i == str.size()))
{
comma_flag = false;
space_flag = false;
CCString *px, *py;
px=CCString::create(x);
py=CCString::create(y);
CCPoint p = CCPointMake(px->intValue(), py->intValue());
point.push_back(p);
x.clear();
y.clear();
if (i == str.size())
{
break;
}
}
else
{
if (comma_flag == false)
{
x.push_back(str[i]);
}
else
{
y.push_back(str[i]);
}
}
}
return point;
}


之后获取折线的各点位置,并使精灵按照折线进行运动:

CCTMXTiledMap* map = CCTMXTiledMap::create("TileGameResources/TiledMap.tmx");
addChild(map, 0, kTagTileMap);
//	map->setPosition(ccp(100, 100));
CCTMXObjectGroup* group = map->objectGroupNamed("object0");
CCArray* all_objects = group->getObjects();
CCObject* object = NULL;
const char* key = NULL;
CCARRAY_FOREACH(all_objects, object)
{
CCDictionary* dict = (CCDictionary*)object;
if (dict == NULL)
break;
key = "name";
CCString* name = (CCString*)dict->valueForKey(key);
if (name->m_sString == "line")
{
key = "x";
int startX, startY;
startX = ((CCString*)(dict->valueForKey(key)))->intValue();
key = "y";
startY = ((CCString*)(dict->valueForKey(key)))->intValue();
key = "polyline";
CCString* PointStr = (CCString*)dict->valueForKey(key);
vector<CCPoint> point = point_dispatch(PointStr->m_sString);
CCSprite* sprite = CCSprite::create("grossini_dance_10.png");
sprite->setScale(0.3f);
map->addChild(sprite);
sprite->setPosition(ccp(startX, startY));
CCArray* actions = CCArray::createWithCapacity(10);
for (int i = 1; i < point.size(); i++)
{
CCActionInterval* mobeTo = CCMoveTo::create(1.0f, ccp(startX+point[i].x,startY-point[i].y));
actions->addObject(mobeTo);
}
CCSequence* action_seq = CCSequence::create(actions);
sprite->runAction(action_seq);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: