【cocos2d-x】瓷砖地图(TileMap)基础知识
更新:HHH   时间:2023-1-7


在瓷砖地图游戏里,游戏图形由叫做“瓷砖”(tiles)的一小组图片相互排列组成。这些图片被放置在一个网格中,得到的效果就是令人信服的游戏世界。瓷砖地图的概念非常吸引人,因为你可以节省内存而不必使用很多贴图渲染整个世界,同时还可以有很多不同的组合。

 

本章将会使用最简单的一种瓷砖地图:90度角瓷砖地图(Orthogonal Tilemaps),介绍瓷砖地图的一般概念。它们是用正方形或长方形的瓷砖组成的,通常以从上到下的视角展示游戏世界。
 

Tiled Map Editor(瓷砖地图编辑器)
最出名的用于生成cocos2d-x中可用的瓷砖地图的编辑器叫做 Tiled Map Editor(在此我简称它为 Tiled)。cocos2d-x游戏引擎原生支持 Tiled 生成的TMX文件。Tiled是免费的,官方网站http://www.mapeditor.org/
 
好像2.02的源码中地图加载模块有问题  请替换 :点我下载  
下载之后替换到cocos2dx下的tilemap_parallax_nodes里面的代码删除  解压出来的代码放入文件夹
 
要在cocos2d-x中使用TMX格式的瓷砖地图,首先必须把TMX文件和它所引用的瓷砖集图片文件作为资源添加到自己项目中。 在本例子中  我们将level1.tmx和tileSet.png加入到我们的项目中   
素材下载:点我下载
在代码里加载和显示瓷砖地图非常方便,以下代码来自MainScene2类的init方法: 
  1. CCTMXTiledMap *map=CCTMXTiledMap::create("level1.tmx"); 
  2. this->addChild(map); 
  3. CCTMXLayer *tmxlayer=map->layerNamed("walls"); 
  4. tmxlayer->setVisible(false); 

CCTMXTiledMap类是用TMX文件名来初始化的,然后作为子节点被添加到当前层中

下一步是通过使用tileMap的layerNamed方法和在Tiled中应用过的层命名"walls",来获取CCTMXLayer(也就是之前在Tiled中添加的游戏事件层),我们通过第四行  可以将地图中的砖块层隐藏掉

好了   运行程序 我们可以在手机上看到  地图已经显示了  但是你还不能去操作

接下来 我们需要判断  是否按中了问号方块

我们先将按下的坐标  转换为tmx地图的坐标

  1. CCPoint MainScene2::tilePosFromLocation(CCPoint touchpoint, 
  2.         CCTMXTiledMap *map) { 
  3.     // 触摸的屏幕坐标必须减去瓷砖地图的坐标 - 万一瓷砖地图位置已经不在(0,0)点上了 
  4.     CCPoint point = ccpSub(touchpoint, map->getPosition()); 
  5.  
  6.     // 将得到坐标值转换成整数 
  7.     point.x = (int) (point.x / map->getTileSize().width); 
  8.     point.y = (int) ((map->getMapSize().height * map->getTileSize().height 
  9.             - point.y) / map->getTileSize().height); 
  10.  
  11.     return point; 

转换后的坐标就类似于   如图

  1. void MainScene2::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) { 
  2.  
  3.     CCNode *node = getChildByTag(TargetMap); 
  4.     CCTMXTiledMap *map = (CCTMXTiledMap*) node; 
  5.  
  6.     CCPoint touchpoint = CCDirector::sharedDirector()->convertToGL( 
  7.             pTouch->getLocationInView()); 
  8.     CCPoint mappoint = tilePosFromLocation(touchpoint, map); 
  9.     CCLog("mappoint.x=%f,mappoint.y=%f", mappoint.x, mappoint.y); 
  10.  
  11.     bool isTouchOnWall = false
  12.  
  13.     CCTMXLayer *maplayer = map->layerNamed("walls"); 
  14.     int tileGID = maplayer->tileGIDAt(mappoint); 
  15.  
  16.     CCLog("tileGID=%i", tileGID); 
  17.     if (tileGID != 0) { 
  18.         CCDictionary *properties = map->propertiesForGID(tileGID); 
  19.         if (properties) { 
  20.             CCString *isQuesWall = (CCString*) (properties->objectForKey( 
  21.                     "isQues")); 
  22.             isTouchOnWall = isQuesWall->boolValue() == true
  23.         } 
  24.     } 
  25.  
  26.     CCLabelTTF *label=(CCLabelTTF*)(getChildByTag(TargetLabel)); 
  27.     if(isTouchOnWall){ 
  28.         label->setString("按下问号砖块"); 
  29.     }else
  30.         label->setString("未按到问号砖块"); 
  31.     } 

首先 我们来解释下上面的代码

3-4行:通过tag 获取CCTMXTiledMap节点;

6行:获取按下的坐标点 并转换为以左下角为原点的坐标;

8行:将按下的坐标 转换为tmx坐标地图

11行:用于存储是否按到了问号砖块

13行:获取tmx地图集中的walls层

14行:获取按下坐标所对应的瓷砖的gid (利用CCTMXLayer的tileGIDAt方法,你可以获取指定坐标上瓷砖的GID编号。)

18行:CCTMXTiledMap有一个叫做propertiesForGID方法,如果指定GID编号的瓷砖附带属性的话,此方法会返回一个CCDictionary字典。这个NSDictionary字典包含了在Tiled中为瓷砖添加的属性。字典的键/值都是用CCString对象存储的。

   CCDictionary的每一个属性都可以通过它的valueForKey方法来获取,返回的是一个CCString对象。要从一个CCString对象中获取布尔值,你可以使用CCString的boolValue方法;而要获取整数或者浮点数,你可以使用CCString的intValue或者floatValue方法。

如果你需要在地图上修改单个瓷砖,你可以使用removeTileAt和setTileGID这两个方法。在游戏过程中,前者会移除指定层上的瓷砖,后者则会替换指定层上瓷砖:

  1. maplayer->removeTileAt(mappoint); 
  2. maplayer->setTileGID(tileGID,mappoint); 

-------------------------

map->getTileSize():当个瓷砖的大小

map->getMapSize():指横竖瓷砖的块数


滚动瓷砖地图

 实际上我们可以很轻松的实现地图的滚动,因为我们只需要让CCTMXTiledMap移动就可以了。


以后基本都是讲解实例 一个Demo写完之后就写一个教程,前两天接了个项目,所以没怎么研究cc2dx

 

本教程根据Cocos2d教程翻译过来

使用的cocos2d-x版本为2.02

返回游戏开发教程...