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”拆分的函数如下:
之后获取折线的各点位置,并使精灵按照折线进行运动:
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); } }
相关文章推荐
- Gallery 和probe数据集
- Python中assert的用法
- 【颗粒归仓,自考总结】——数据库系统原理总结
- 归档备忘!
- 为什么匿名内部类和局部内部类只能访问final变量
- java stack
- 云的初步认识
- iOS学习笔记34-Apple Watch两个月开发的一些收获总结
- 黑马程序员 Java基础——Map接口及其实现类
- 布线问题
- HDU 5073 Galaxy
- 数据请求常规操作步骤
- C语言基础
- Android Studio如何设置代码自动提示
- 关于伪基站的攻击
- sift尺度空间的理解以及计算
- CLR 无法从 COM 上下文 0x208f68 转换为 COM 上下文 0x2090d8,这种状态已持续 60 秒
- linux下的网卡eth0配置详解
- 专访吴恩达:我不关心人工智能是否变邪恶
- 第十三周第一天