直角瓦片地图

第10章 瓦片地图
在瓦片地图游戏中,图形由一些排列整齐的“瓦片”组成。将这些瓦片房子放在一个网格中,可以使我们创建逼真的游戏世界。瓦片地图的概念非常具有吸引力,因为比起用一张贴图来绘制整个世界,它更省内存,而且还可以有许多不同的组合。
直角瓦片地图由正方形或长方形瓦片构成,并以一种自顶向下(top-down)的方式展现世界。
10.1 瓦片地图简介
瓦片地图是由单个瓦片组成的2D游戏世界。使用少量尺寸相同的图像就可以创建出很大的世界地图,这意味着瓦片地图擅长为大地图节省内存。
瓦片地图的编辑工作通常通过编辑器来完成,cocos2d直接支持一个名为Tiled(Qt)的地图编辑器。Tiled是免费的、开源的,能够比那几直角瓦片地图和多层的斜角瓦片地图。Tiled还能够添加触发区域和对象,以及定义瓦片的属性以在代码中确定瓦片的类型。
注意:
Qt是指诺基亚的Qt框架,Tiled就是用它构建而成的。因为还有一个已经不用了的Java版Tiled,所以有必要写成Tiled(Qt)来区分一下。
斜角瓦片地图是通过将瓦片图像画成钻石形状(菱形),并将距离观察者近的瓦片覆盖在距离观察者远的瓦片之上来获得这种深度感。
10.2 使用Zwoptex处理图像
对于Tiled地图编辑器而言,瓦片的位置是很重要的。因为Tiled通过位置和偏移来引用瓦片集中的单个瓦片。这意味着如果纹理图册中的瓦片位置发送改变,Tiled中使用这个瓦片集贴图的瓦片地图会完全变样。
10.3 Tiled地图编辑器
Tiled地图编辑器广泛用于创建可在cocos2d中使用的瓦片地图。它创建的TMX文件可被cocos2d游戏引擎原生支持。Tiled地图编辑器是免费的,可以从它的首页www.mapeditor.org上下载。
10.3.1 创建新的瓦片地图
Tiled同时支持直角瓦片地图和斜角瓦片地图。地图的大小是瓦片数而不是像素。
瓦片的宽度和高度是瓦片集中每张瓦片的尺寸。Margin和Spacing指定了瓦片与图像边界的距离以及瓦片与瓦片间的距离。
如果用的是Zwoptex创建的瓦片集贴图,就必须在Margin和Spacing中输入Zwoptex里设定的像素填充值。Zwoptex默认使用两个像素作为填充值。
加载新的瓦片集图像时,要确保瓦片集图像已经在项目的资源文件夹中,还要保证将瓦片地图的TMX文件保存到与所使用瓦片集图像相同的文件夹中,否则cocos2d可能无法加载瓦片集图像——在试图加载TMX文件时会发生运行时一次,这是由于TMX文件使用它所在的位置的相对路径来引用瓦片集图像导致的。如果它们不在同一个文件夹中,cocos2d可能无法找到图像,因为在应用程序被加载到模拟器或设备上时,文件夹的结构是不会被保留的。
提示:
TMX文件是纯XML文件,所以你可能会好奇,想看看它内部的样子。如果看到图像文件是通过部分路径进行引用的,那么cocos2d可能无法加载被引用的图像。图像的引用应该只有图像名而没有任何路径,就像下面这样:<image source=”tiles.png”>。
10.3.2 设计瓦片地图
Tiled提供了4种模式用于编辑瓦片地图,可通过工具栏最右侧的4个图标进行切换。它们分别是:Stamp Brush(快捷键为B),绘制瓦片集中当前选中的瓦片;Bucket Fill(快捷键为F),填充相邻的由相同瓦片连成的区域;Eraser(快捷键为E),擦除瓦片;Rectangular Select(快捷键为R),选取某个区域内的瓦片,然后可以复制和粘贴选中的区域。
10.4 在cocos2d中使用直角瓦片地图
要在cocos2d中使用TMX瓦片地图,就必须把TMX文件和附带的瓦片集图像作为资源添加到Xcode项目中。
瓦片全局标识符(GID)的概念。它们是唯一的整数,每一个对应用瓦片地图中的一个瓦片。地图中的瓦片被连续地标上符号,号码从1开始。GID为0代表空白瓦片。
CCTMXTiledMap有一个propertiesForGID方法,如果所给GID对应的瓦片有属性,该方法会返回一个NSDictonary。这个NSDictonary中包含在Tiled中编写的属性。它将任何键/值对存储为NSString对象。
对于更加局部性的瓦片修改操作,可以使用removeTileAt和setTileGID方法在游戏中删除或替换某一个特定层中的瓦片。
10.4.1 定位被触摸的瓦片
10.4.2 提高性能和可读性
10.4.3 使用对象层
由于对象层是一种特殊的层,因此不能用瓦片地图的layerNamed方法来获取它。对象层在cocos2d中对应的类是CCTMXObjectGroup。可以通过使用瓦片地图的objectGroupNamed方法并将Tiled中设定的对象层的名称作为参数,来获取名为Objectlayer的对象层的CCTMXObjectGroup实例。接下来对NSMutableArray对象的objectLayer.objects进行了遍历,它包含了一个NSDictionary属性列表,这些NSDictionary属性和瓦片地图提供的propertiesForGID方法返回的一样,只不过这些NSDictionary属性和瓦片地图的propertiesForGID方法返回的一样,只不过这些NSDictionary属性的内容是Tiled提供的而不是用户编写的,它们仅仅包含了每个矩形的坐标。
10.4.4 绘制对象层矩形
每一个CCNode都有一个-(void) draw方法,通过重写该方法可以添加自定义的OpenGL ES代码。
在编写OpenGL代码时,修改后恢复状态是一个好习惯,否则会影响其他绘制代码产生的结果。OpenGL是一个状态机,因而会记住任何设置的修改,从而影响后面的绘制方法。为了避免此问题发生,在完成绘制后,任何被修改过的设置都应该恢复成默认值。
注意:
-(void) draw方法中绘制代码的z轴次序(z-order)总是0,而且会在所有z轴次序为0的节点之前进行绘制,这就意味着OpenGL ES代码绘制的结果会被任何z轴次序是0的节点覆盖,在绘制对象层的粒子中,必须将tileMap的z轴次序设为-1,这样一来,对象层矩形才能被绘制在瓦片地图之上。
10.4.5 滚动瓦片地图

猜你喜欢

转载自bsr1983.iteye.com/blog/1672029