TiledMap地图使用
发表于2019-03-20
TiledMap简介
TiledMap是一款地图编辑器。我们常用它编辑一些相似度很大的背景,例如天天酷跑,游戏的地图就是用很多相同的色块组成。如果用纯代码取拼接那会很复杂,如果用TileMap去制做一个地图,那么运用起来就很简单。
/************************************************************************/ /*打开Tiled软件,新建一个文件,设置宽度和高度,然后添加图块(下图),添加好了后 自己创建地图,然后保存为level01.tmx. */ /************************************************************************/
1.在程序中加载tmx文件
CCTMXTiledMap *map = CCTMXTiledMap::create("level01.tmx"); this->addChild(map);
2.使用对象层(设置一个固定的精灵起点)
命名为objects,
设置对象属性,
在代码中获取到X和Y坐标的值:
/*加载对象层*/ CCTMXObjectGroup *objGroup = map->objectGroupNamed("objects"); /*加载玩家坐标对象*/ CCDictionary* playerPointDic = objGroup->objectNamed("PlayerPoint"); float x = playerPointDic->valueForKey("x")->floatValue(); float y = playerPointDic->valueForKey("y")->floatValue(); /*设置玩家坐标*/ m_player->setPosition(ccp(x,y));
3.添加障碍物,Tiled障碍层的使用
命名barrier,
此时主角精灵还是能够越过这个障碍继续向前,还得建一个meta层,添加新素材meta_tiles.png
选择第一个方块,右键
然后选中meta层,将刚才的方块挨个放在之前的障碍物上面,保存地图。
代码中如何判断:
CCPoint tiledCoordForPosition(CCPoint pos) { /*函数功能:将像素坐标转换成地图格子坐标*/ CCSize mapTiledNum = m_map->getMapSize();//地图方块数 CCSize tiledSize = m_map->getTiledSize();//单个方块的大小 int x = pos.x/tiledSize.width; int y = (640-pos.y)/tiledSize.height; if(x>0){ x-=1; } if(y>0){ y-=0; } return ccp(x,y); }
void setTagPosition(int x,int y) { /*判断前方是否不可通行*/ /*取主角前方的坐标*/ CCSize spriteSize = GetSprite()->getContentSize(); CCPoint dstPos = CCPoint(x+spriteSize.width/2,y); /*获得相应坐标的格子位置*/ CCPoint tiledPos = tiledCoordForPosition(ccp(dstPos.x,dstPos.y)); /*获得格子的唯一标示*/ CCTMXLayer* meta = m_map->layerNamed("meta"); meta->setVisible(false); meta->retain(); int tiledGid = meta->tileGIDAt(tiledPos); /*不为0表存在这个格子*/ if(tiledGid!=0) { /*这个格子既属于meta,同时也属于整个地图的*/ CCDictionary* propertiesDict = m_map->propertiesForGID(tiledGid); /*取得格子的属性*/ const CCString* prop = propertiesDict->valueForKey("Collidable"); /*判断Collidable里面的属性值是否为true,如果是,不让玩家移动*/ if(prop->m_sString.compare("true")==0){ return; } } Entity::setTagPosition(x,y); /*以主角为中心移动地图*/ setViewPointByPlayer(); }
4.从障碍层清除当前格子的物体
CCTMXLayer* barrier = m_map->layerNamed("barrier"); barrier->removeTileAt(tiledPos);
以上就是TiledMap地图的使用,希望能帮到大家,如果大家还想了解的更多,可以参考《瓦片地图 Tiled Map》