如何用quick cocos2d x-x来做一个基于TileMap地图块的游戏

您还可以使用以下方式登录
当前位置:&>&&>&&>& > Cocos2d-X研究之v3.x瓦片地图详解
Cocos2d-X研究之v3.x瓦片地图详解
在游戏开发过程中,我们会遇到超过屏幕大小的地图,例如即时战略游戏,使得玩家可以在地图中滚动游戏画面。这类游戏通常会有丰富的背景元素,如果直接使用背景图切换的方式,需要为每个不同的场景准备一张背景图,而且每个背景图都不小,这样会造成资源浪费。瓦片地图就是为了解决这问题而产生的。一张大的世界地图或者背景图可以由几种地形来表示,每种地形对应一张小的的图片,我们称这些小的地形图片为瓦片。把这些瓦片拼接在一起,一个完整的地图就组合出来了,这就是瓦片地图的原理。TileMap方案在Cocos2d-x中,瓦片地图实现的是TileMap方案,TileMap要求每个瓦片占据地图上一个四边形或六边形的区域。把不同的瓦片拼接在一起,就可以组成完整的地图了。我们需要很多较小的纹理来创建瓦片。通常我们会将这些较小的纹理放图一张图片中,这样做会提高绘图性能。瓦片地图编辑器Cocos2d-x支持由瓦片地图编辑器Tiled Map Editor制作并保存为TMX格式的地图。Tiled Map Editor是一个开源项目,支持Windows、Linux及Mac OS X多个操作系统,我们可以从官网下载到编辑器的Java和QT版本。如何使用Tiled工具建立地图可以参考以下文章:如何使用cocos2dx3.0制作基于tilemap的游戏地图方向Tiled地图支持直角鸟瞰地图(90°地图)、等距斜视地图(斜45°地图)和六边形地图,不支持左右或上下边界的六边形地图。地图资源建议瓦片地图素材大小为32*32的倍数瓦片素材组与其他图片不能混合使用只有瓦片素材图能被导入TMX文件每个Layer最多支持1套瓦片素材组。瓦片层TMX文件中瓦片层的数量没有上限每一个瓦片层只能由一种瓦片素材组成每一个瓦片层可以被TMXLayer类表示-为SpriteSheet的子类每一个单一的瓦片被Sprite表示-父节点为TMXLayer对象层瓦片地图支持对象组用来添加除背景以外的游戏元素-道具、障碍物等对象组中的对象在TMX文件中以键值对形式存在,因此可以直接在TMX文件中对他进行修改瓦片地图坐标系对于一个16*16的瓦片地图文件的坐标系统为(0, 0): 左上角(15, 15): 右下角在Cocos2d-x中使用TMX创建TMX节点12TMXTiledMap *map= TMXTiledMap::create("bg.tmx");addChild(map,0);遍历子节点1VectorpChildrenArray = map-&getChildren(); SpriteBatchNode*child =NULL; Ref*pObject =NULL; for(Vector::iteratorit =pChildrenArray.begin();it !=pChildrenArray.end();it++){
pObject= *
child= (SpriteBatchNode*)pO }获取/删除一个瓦片123TMXLayer*layer =map-&getLayer("layer0");Sprite* tile0= layer-&getTileAt(Point(1,15));layer-&removeTileAt(Point(1,15));遍历对象层中对象TMXObjectGroup*objectGroup =map-&getObjectGroup("center");ValueVector object= objectGroup-&getObjects(); for (ValueVector::iteratorit =object.begin();it !=object.end();it++){
Valueobj =*
ValueMap map= obj.asValueMap();
log("x = %d y = %d",map.at("x").asInt(),map.at("y").asInt());} 就爱阅读网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。
欢迎转载:
推荐:    /walzer/archive//1871561.html
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:111466次
积分:1771
积分:1771
排名:千里之外
原创:39篇
转载:156篇
(1)(2)(1)(1)(8)(5)(2)(2)(3)(8)(6)(8)(13)(1)(6)(6)(3)(2)(1)(14)(8)(22)(11)(4)(31)(15)(18)(8)用户名:包灬子
文章数:36
评论数:13
访问量:66248
注册日期:
阅读量:1297
阅读量:3317
阅读量:437019
阅读量:1124123
[匿名]51cto游客:
51CTO推荐博文
在瓷砖地图游戏里,游戏图形由叫做&瓷砖&(tiles)的一小组图片相互排列组成。这些图片被放置在一个网格中,得到的效果就是令人信服的游戏世界。瓷砖地图的概念非常吸引人,因为你可以节省内存而不必使用很多贴图渲染整个世界,同时还可以有很多不同的组合。
本章将会使用最简单的一种瓷砖地图:90度角瓷砖地图(Orthogonal&Tilemaps),介绍瓷砖地图的一般概念。它们是用正方形或长方形的瓷砖组成的,通常以从上到下的视角展示游戏世界。
Tiled Map Editor(瓷砖地图编辑器)
最出名的用于生成cocos2d-x中可用的瓷砖地图的编辑器叫做 Tiled Map Editor(在此我简称它为 Tiled)。cocos2d-x游戏引擎原生支持 Tiled 生成的TMX文件。Tiled是免费的,官方网站
好像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地图的坐标
CCPoint&MainScene2::tilePosFromLocation(CCPoint&touchpoint,&&&&&&&&&CCTMXTiledMap&*map)&{&&&&&&&&&&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&&}&
转换后的坐标就类似于 & 如图
void&MainScene2::ccTouchEnded(CCTouch&*pTouch,&CCEvent&*pEvent)&{&&&&&&CCNode&*node&=&getChildByTag(TargetMap);&&&&&CCTMXTiledMap&*map&=&(CCTMXTiledMap*)&&&&&&&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(&未按到问号砖块&);&&&&&}&}&
首先 我们来解释下上面的代码
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
本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)}

我要回帖

更多关于 cocos2d x 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信