在瓷砖地图游戏里,游戏图形由叫做“瓷砖”(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方法:
- CCTMXTiledMap *map=CCTMXTiledMap::create("level1.tmx");
- this->addChild(map);
- CCTMXLayer *tmxlayer=map->layerNamed("walls");
- tmxlayer->setVisible(false);
- CCPoint MainScene2::tilePosFromLocation(CCPoint touchpoint,
- CCTMXTiledMap *map) {
- // 触摸的屏幕坐标必须减去瓷砖地图的坐标 - 万一瓷砖地图位置已经不在(0,0)点上了
- CCPoint point = 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);
- return point;
- }
- void MainScene2::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {
- CCNode *node = getChildByTag(TargetMap);
- CCTMXTiledMap *map = (CCTMXTiledMap*) node;
- CCPoint touchpoint = CCDirector::sharedDirector()->convertToGL(
- pTouch->getLocationInView());
- CCPoint mappoint = tilePosFromLocation(touchpoint, map);
- CCLog("mappoint.x=%f,mappoint.y=%f", mappoint.x, mappoint.y);
- bool isTouchOnWall = false;
- CCTMXLayer *maplayer = map->layerNamed("walls");
- int tileGID = 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("未按到问号砖块");
- }
- }
CCDictionary的每一个属性都可以通过它的valueForKey方法来获取,返回的是一个CCString对象。要从一个CCString对象中获取布尔值,你可以使用CCString的boolValue方法;而要获取整数或者浮点数,你可以使用CCString的intValue或者floatValue方法。 |
- maplayer->removeTileAt(mappoint);
- maplayer->setTileGID(tileGID,mappoint);