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》
