首页 > 代码库 > cocos2dx中的格子地图TileMap

cocos2dx中的格子地图TileMap

格子地图的优点:

a.节省内存,我们知道对于一款游戏来说,如果以图片来作为地图的话,对于神庙逃亡,魂斗罗这样的场景很多,地图很长的游戏显然不现实,因为图片很占内存,但是这些游戏的地图有一个特点就是:重复的部分很多,比如魂斗罗游戏的每一关的地图里边,无外乎,陆地,海洋,天空,草地等等这些元素,设想我们把地图分成一个一个的小格子,那么这么一张大的地图则只需要五种格子即可构成:陆地格子,海洋格子,天空格子,草地格子,其他格子等,而需要的地方只需要把这几种格子组合即可,这样在内存中只需要存储这五种格子的小块图片,是不是大大节约了内存呢

b.系统限制,不支持大的图片作为地图,例如android系统最大支持2048X2048的图片,而IOS系统也顶多支持4096X4096大小的图片

格子地图:可以理解为用不同的瓷砖贴地板

格子地图中的数据编码一般采用base64编码,编码规则是没6bit位将二进制进行编码成文本,

const char base64[]="A-Za-z0-9+-";//将每6位二进制编码成前面字符串中的某一位字符,因此又具有一定的加密功能

2^6=64, (0~63),所以称base64编码

cocos中有专门处理格子地图的类:CCTMXTileMap

 

创建格子地图:

CCTMXTileMap *map=CCTMXTileMap::create("xxx.tmx");//创建依赖.tmx文件,它其实是一个xml文件,是对格子地图的描述

addchild(map);//格子地图也是一个CCNode对象,可以添加到渲染树上

class  CCTMXTiledMap : public CCNode //格子地图本质也是一个CCNode

格子地图中的几个概念:

1.图层,CCTMXLayer,本质是一个精灵集合

获取图层:CCTMXLayer *layer = map->layerNamed(const char *layerName);//根据图层的名字来获取图层

class   CCTMXLayer : public CCSpriteBatchNode

2.地图格子:实质就是精灵,CCSprite

获取地图格子:CCSprite *spr = layer->tileAt(ccp(2, 2));//获取指定位置的地图格子,本质是一个CCSprite

TileID:格子地图中的地图格子的编号,可以通过TileID来获得地图格子的类型

获取指定位置的地图格子的id:

 int gid = layer->tileGIDAt(ccp(2, 2));//获取指定位置的地图格子的编号
 CCLog("gid=%d", gid);

设置格子精灵消失:layer->setTileGID(0, ccp(3, 3));//设置格子精灵为id=0,即消失

 

//将格子地图坐标转换为世界坐标

CCPoint T23TileMap::Tile2PointLB(CCPoint ptTile)

{

   int x = _map->getTileSize().width*ptTile.x;//dx*x  

  int y = (_map->getMapSize().height - 1 - ptTile.y)*_map->getTileSize().width;//(24-1-y)*dy  

  return ccp(x, y);

}

//将openGL坐标转换为格子地图坐标

CCPoint T23TileMap::Point2Tile(CCPoint ptGL)

{

   int dx = _map->getTileSize().width;

   int dy = _map->getTileSize().height;

   CCPoint ptMap = _map->convertToNodeSpace(ptGL);//将世界坐标转换为以地图为基点的本地坐标

   int x = ptMap.x / dx;

   int y =ptMap.y / dy;  

  y = _map->getMapSize().height - 1 - y;//本地坐标是以基准节点的左下角为原点的,而格子地图的原点是左上角,故应该用y轴方向的总格子数减去y/dy,才是真正的格子地图的坐标

   return ccp(x, y);

}

 

cocos2dx中的格子地图TileMap