【cocos2d-x】瓷砖地图(TileMap)基础知识
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方法:
CCTMXTiledMap*map=CCTMXTiledMap::create("level1.tmx");this->addChild(map);CCTMXLayer*tmxlayer=map->layerNamed("walls");tmxlayer->setVisible(false);
CCTMXTiledMap类是用TMX文件名来初始化的,然后作为子节点被添加到当前层中
下一步是通过使用tileMap的layerNamed方法和在Tiled中应用过的层命名"walls",来获取CCTMXLayer(也就是之前在Tiled中添加的游戏事件层),我们通过第四行 可以将地图中的砖块层隐藏掉
好了 运行程序 我们可以在手机上看到 地图已经显示了 但是你还不能去操作
接下来 我们需要判断 是否按中了问号方块
我们先将按下的坐标 转换为tmx地图的坐标
CCPointMainScene2::tilePosFromLocation(CCPointtouchpoint,CCTMXTiledMap*map){//触摸的屏幕坐标必须减去瓷砖地图的坐标-万一瓷砖地图位置已经不在(0,0)点上了CCPointpoint=ccpSub(touchpoint,map->getPosition());//将得到坐标值转换成整数point.x=(int)(point.x/map->getTileSize().width);point.y=(int)((map->getMapSize().height*map->getTileSize().height-point.y)/map->getTileSize().height);returnpoint;}
转换后的坐标就类似于 如图
voidMainScene2::ccTouchEnded(CCTouch*pTouch,CCEvent*pEvent){CCNode*node=getChildByTag(TargetMap);CCTMXTiledMap*map=(CCTMXTiledMap*)node;CCPointtouchpoint=CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView());CCPointmappoint=tilePosFromLocation(touchpoint,map);CCLog("mappoint.x=%f,mappoint.y=%f",mappoint.x,mappoint.y);boolisTouchOnWall=false;CCTMXLayer*maplayer=map->layerNamed("walls");inttileGID=maplayer->tileGIDAt(mappoint);CCLog("tileGID=%i",tileGID);if(tileGID!=0){CCDictionary*properties=map->propertiesForGID(tileGID);if(properties){CCString*isQuesWall=(CCString*)(properties->objectForKey("isQues"));isTouchOnWall=isQuesWall->boolValue()==true;}}CCLabelTTF*label=(CCLabelTTF*)(getChildByTag(TargetLabel));if(isTouchOnWall){label->setString("按下问号砖块");}else{label->setString("未按到问号砖块");}}
首先 我们来解释下上面的代码
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这两个方法。在游戏过程中,前者会移除指定层上的瓷砖,后者则会替换指定层上瓷砖:
maplayer->removeTileAt(mappoint);maplayer->setTileGID(tileGID,mappoint);
-------------------------
map->getTileSize():当个瓷砖的大小
map->getMapSize():指横竖瓷砖的块数
滚动瓷砖地图
实际上我们可以很轻松的实现地图的滚动,因为我们只需要让CCTMXTiledMap移动就可以了。
以后基本都是讲解实例 一个Demo写完之后就写一个教程,前两天接了个项目,所以没怎么研究cc2dx
本教程根据Cocos2d教程翻译过来
使用的cocos2d-x版本为2.02
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。