cocos2d-x 中的CCTileMap

2024-09-04 10:38
文章标签 cocos2d cctilemap

本文主要是介绍cocos2d-x 中的CCTileMap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Cocos2d supports the following TMX maps:(Cocos2d 支持如下TMX地图形式)

地图定向( Orientation):

  • Orthogonal maps 直角鸟瞰地图(90°地图)
  • Isometric maps  等距斜视地图(斜45°地图)
  • Hexagonal maps  六边形地图 ( 左右或上下边界的六边形地图不被Tiled支持)(edges on left-right. edges at top-bottom are not supported… it seems that Tiled doesn’t support them either)

 

地图形式(Tiles):

  • 被嵌套的瓦片地图不被支持(如 使用瓦片素材组与其他图片)
  • 仅支持封装瓦片地图组(仅有瓦片素材组被导入地图文件)
  • 每个Layer最多支持1套瓦片素材组。

 

地图层(Layers):

  • Tiles中Layer的数量没有上限。
  • 每一个Layer可以被CCTMXLayer类表示( 为CCSpriteSheet的子类)
  • 每一个单一的瓦片被CCSprite表示(父节点为CCTMXLayer)

 

对象组 (Object Groups):

  • 瓦片地图支持对象组

 

 

坐标(Coordinates) 和 全局标识(GIDS)

坐标

64*32的Tiled瓦片地图文件的坐标系统为:

  • (0,0): 左上角
  • (63,31): 右下角

 

全局标识(GIDS)

 

瓦片的GID是一个全局标识量,他的范围从正整数1开始,到瓦片地图中tile的总量。

 

如果你的地图中有5个不同的瓦片,那么:

  • 瓦片0的GID为1
  • 瓦片1的GID为2
  • 瓦片3 的GID为3
  • 以此类推

 

瓦片的GID 为 0 被用来表示此瓦片为空。

 

如何建立一个TMX节点

 
  1. // create a TMX map
  2. CCTMXTiledMap *map = CCTMXTiledMap::create("TileMaps/iso-test-vertexz.tmx");
  3.  
  4. addChild(map, 0, kTagTileMap);
  5.  
  6. // All the tiles by default will be aliased. If you want to create anti-alias tiles, you should do:
  7.  
  8. // iterate over all the "layers" (atlas sprite managers)
  9.  
  10. // and set them as 'antialias'
  11.  
  12. CCArray * pChildrenArray = map->getChildren();
  13.  
  14. CCSpriteBatchNode* child = NULL;
  15.  
  16. CCObject* pObject = NULL;
  17.  
  18. CCARRAY_FOREACH(pChildrenArray, pObject)
  19. {
  20. child = (CCSpriteBatchNode*)pObject;
  21.  
  22. if(!child)
  23. break;
  24.  
  25. child->getTexture()->setAntiAliasTexParameters();
  26. }

如何获取/添加/删除/修改一个瓦片

指定坐标获取Tile:

 
  1. CCTMXLayer* layer = map->layerNamed("Layer 0");
  2.  
  3. CCSprite *tile0 = layer->tileAt(ccp(1,63));

指定坐标获取GID

 
  1. unsigned int m_gid = layer->tileGIDAt(ccp(0,63));

指定坐标设置一个新的GID

 
  1. layer->setTileGID(m_gid, ccp((float)3, (float)3));
  2. // To remove a tile at a certain coordinate
  3. layer->removeTileAt( ccp(5.0, 5.0) );

遍历Layer中的瓦片

 
  1. CGSize s = layer->getLayerSize();
  2.  
  3. for( int x=0; xtileGIDAt(ccp(x,y));
  4.  
  5. layer->setTileGID(tmpgid+1,ccp(x,y));
  6.  
  7. }
  8.  
  9. }

Z序列和深度缓冲

 

以下信息仅针对俯视地图( Orthogonal)和斜视地图(Isometric)。对六边形地图(Hexagonal)无效。

 

如果你的游戏需要根据精灵的Y坐标把精灵放置到一些特定瓦片的前面或后面(在斜视地图中常见,同时出现在一些俯视地图中),那么你有2个选择:

  • 使用OpenGL ES 深度缓冲
  • 使用多Layer的TMX设置Z序列

 

深度缓冲(Depth Buffer)

 

建立一个含有至少2个TMX Layer层的瓦片地图很重要:

  • 一个背景层,例如草地
  • 一个前景层,例如树木

草地层会显示在精灵之后,所以他的z序列应该为最小的值,例如-1000. 树木层中的每一个单一瓦片应该有不同的Z序列值,在底部的瓦片的Z序列应该大于顶部的瓦片序列。

 

因此,为了实现分层显示,你只需要做如下步骤:

  • 打开Tiled编辑器
  • 选择背景层(如草地)
  • 选择 Tiled → Layer → Layer Properties  设置Layer的属性
  • 添加: cc_vertexz = -1000
  • 选择前景层(如草地)
  • 选择 Tiled → Layer → Layer Properties
  • 添加 cc_vertexz = automatic 让其根据坐标自动排Z序列。

 

 

范例:

 

斜视地图Z顶点范例。 地图有2个层,”树木“层和”草地“层。 对“树木”设置属性 cc_vertex=automatic。然后对“草地”层添加 cc_vertexz=-1000。

 

俯视地图Z顶点范例。 地图同样有2个层,”树木“层和”草地“层。对“树木”设置属性 cc_vertexz=automatic 并且cc_alpha_func=0.5。 然后对“草地”层添加属性cc_vertexz=-1000。

使用多层TMX地图和Z序列

 

在TXM地图中,每一个层(Layer)都被自动赋值了一个Z序列(zOrder),因此不需要添加任何层的z序列属性在TMX编辑器中。将你的精灵添加为TXMMap的子节点可以让你自动的替换当前Layer上的对象。

 
  1. CCSprite m_tamara = CCSprite::create(tamara.png);
  2.  
  3. CCPoint p = m_tamara->getPosition();
  4.  
  5. p = CC_POINT_POINTS_TO_PIXELS;
  6.  
  7. float newZ = -(p.y+32) /16;
  8.  
  9. m_tamara->setVertexZ( newZ );

屏幕截图

俯视地图用了3D的投影和抗锯齿瓦片,瓦片被spritesheet-fixer工具处理过,使用3D投影和抗锯齿也不会有人为变化的痕迹。

俯视地图,地图上瓦片尺寸小于实际瓦片大小。

斜视地图 2D投影与抗锯齿瓦片

六边形地图,2D投影和抗锯齿瓦片。边界界定为瓦片的左右边界。以上下为边界的界定暂不支持。

 

参考

这篇关于cocos2d-x 中的CCTileMap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135787

相关文章

Cocos2d-x自适应Android屏幕分辨

ndroid下分辨率太多,不太可能为每种分辨率做一套资源,目前一般来说比较流行的是320*480, 800*400, 854*400。当然现在720P的也出来了,但至少目前不是主流机型^_^. 对于不支持的分辨率,我希望的是能够按照屏幕大小按比例缩放,即有了下面的代码。 1:ViewAutoScale 写了一个ViewAutoScale函数,如下:   #include "ViewAuto

cocos2d-x Android实现广告条竖立放置

 2:实现 原理:将屏幕设置为竖屏,然后CCDirector::setDeviceOrientation()设置为cocos2d-x为横屏。            在这种转屏模式下,控件是不会旋转的 缺点:所有Android原生控件仍然是竖立的 注意事项: ccTouchesBegan,ccTouchesMoved, ccTouchesEnded传入的坐标值仍然是屏幕坐标

Cocos2d-x 场景切换深入篇

接着上一次的场景切换1,要补充一些内容 如果Last对应的回调函数是这样写的 void MyScene::LastSceneCallback(CCObject* pSender)  {   //CCScene* scene =new MyScene();   //CCLayer* pLayer = new LayerPanda();   //scene->addChild(pLayer

cocos2d-x ScrollView(上)

scrollView 的调用问题困扰我很久,昨天才有时间继续研究这个,可惜最后还是没能完全解决它存在的问题。。。 看头文件: [cpp] view plain copy #ifndef __HELLOWORLD_SCENE_H__  #define __HELLOWORLD_SCENE_H__    #include "cocos2d.h"    #include "../..

cocos2d-x 重力感应

本文没你想象的那么,,复杂。其实就是通过重力感应控制个小球移动而已。 先看头文件: [cpp] view plain copy #ifndef __HELLOWORLD_SCENE_H__  #define __HELLOWORLD_SCENE_H__    #include "cocos2d.h"  USING_NS_CC;    class HelloWorld : public

Cocos2D-X开发神器CocoCreator使用介绍

你还在为搭建Cocos2d-x开发环境而头痛么,还在为平台移植问题而困扰么,我想大家都想更加快速得进行开发,今天才知道这个神器的,稍微使用了一下,觉得还是挺ok的一个开发工具,所以这里推荐给大家。   可以到下面地址下载:    http://cococreator.com/         更详细的介绍请参考CSDN认证专家小巫的博客文章:  ,手机游戏开发培训;      http:/

cocos2d-x 如何使用CCProgressTimer作为血条,实现跟随怪物进行移动,自动掉血,然后死亡。

Cocos2d-x中类CCProgressTimer实现游戏人物血条 一、CCProgressTimer的基本使用步骤: cocos2d-x的进度条函数CCProgressTimer,我们可以这样定义: 1. //s_pPathSister1为图片的路径 2. CCProgressTimer *left = CCProgressTimer::create(

cocos2d的暂停/恢复

cocos2d提供了比较重要的有3种暂停、恢复的机制 分别是CCDirector, CCActionManager, CCScheduler提供的 1 CCDirecotor: -(void) pause; -(void) resume; 导演类的暂停恢复是针对整个运行场景的,所以如果我们还想在暂停的画面上做其他事情,不推荐这种方法 2 CCActionManager -(voi

cocos2d-x基础知识(四) 简单菜单及坐标系

关于cocos2d坐标系的一点点心得   cocos2d-x 中关于convertToNodeSpace 的用法: cocos2d-x 中关于convertToNodeSpace 的用法: A->converToNodeSpace(CCPoint point )的意思是将point 转换成A的坐标系中的位置点。 我在做连连游戏中由于精灵在自定义的CC

cocos2d-x基础知识 坐标系 -- 很好的文章

无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥奔头了。所以玩cocos2d,一上来就先把各种与坐标有关的东西搞清楚。   基本的两个坐标系:屏幕坐标系和GL坐标系。 屏幕坐标系x轴朝右,y轴朝下。默认原点在左上角。 GL坐标系x轴朝右,y轴朝上。默认原点在左下角。          在调用任何需要设置位置的函数,或从函数获取位置信息前,