瓷砖地图

90度角或45度角瓷砖地图

90度角瓷砖地图(Orthogonal Tilemaps)用正方形或长方形的瓷砖组成的,通常以从上到下的视角展示游戏世界。在使用90度角透视的同时,设计师可以使用长方形图片创造出长度比宽度大的物体,由此创造出深度的幻觉。

斜45度角瓷砖地图(Isometric Tilemaps)通过将透视旋转45度以得到更加真实的深度感觉。虽然所有的瓷砖图片实际上是2D的,但是斜45度角瓷砖地图可以让我们的大脑相信我们是在看3D的地图。斜45度角瓷砖地图的图片是钻石形状的(也就是菱形),同时允许相邻的靠近观察者的瓷砖覆盖一部分离观察者远一些的瓷砖。

Tiled

Tiled是一款可免费下载和使用开源工具,可以编辑90度角瓷砖地图和斜45度角瓷砖地图,支持多个层,允许添加触发区域和物体,及为瓷砖添加用来判断瓷砖类型的属性。
http://www.mapeditor.org/中下载for windows或for mac版本。 当前最新版本 v0.16.2
对于Tiled Map Editor来说,瓷砖图片保持在相同的位置是很重要的, 因为编辑器是通过图片位置和相关的位移来引用各个瓷砖的。
可以直接在图片编辑软件中制作瓷砖地图,要把图片的背景设置为透明。所有的瓷砖都要是相同尺寸的,而且瓷砖之间的空间必须保持一致。

生成TMX文件

cocos2d游戏引擎原生支持Tiled生成的TMX文件。
通过菜单栏的 Map ➤ New Tileset 来添加需要的瓷砖集。
Tileset瓷砖集其实就是一张包含多个瓷砖的图片,每个瓷砖之间的间隔相同。
瓷砖层:从菜单选择 Layer ➤Add Tile Layer 生成一个新的瓷砖层。
对象层:从菜单选择 Layer ➤Add Object Layer 生成用于添加物体的层。

Tiled中的物体只是简单的方块而已,可以在里面进行绘画操作,之后则可以在代码中进行获取。

可以使用物体层触发某些事件。
对于物体层中的长方形物体,可以在物体区域内点击右键显示上下文菜单。
“物体层”这个名称有些误导,因为大多数游戏把这些长方形区域作为趣味点和触发区域来使用,而不是作为实际的物体来使用。
物体层是一种不同的层,不能利用瓷砖地图(tilemap)的layerNamed方法得到它。cocos2d中的物体层由CCTMXObjectGroup类表示,这个名字有点误导,因为在Tiled软件中叫做object layer,而不是object group。通过CCTMXObjectGroup类的objectGroupNamed方法得到物体层。可以从物体层中获取所有的定义的矩形,然后判断其它点是否落在这些矩形内。
地图的尺寸是由瓷砖的数量来决定的,而不是像素。单个瓷砖大小必须与单个瓷砖图片的大小相同,否则会导致瓷砖和图片大小不能完全匹配。
把Tiled软件导出的TMX格式的瓷砖地图文件放到与瓷砖集图片相同的文件夹中。TMX文件只能引用同一文件夹下的瓷砖集图片。
TMX文件实际上就是一个XML文件。图片引用的地方不应该包含任何路径,应该只有一个图片文件名。

cocos2d-x好像只能使用对层数据使用了Base64(zlib压缩)格式的tmx文件。

层的使用

使用多个层的好处之一是可以在cocos2d中将地图中的某个区域替换掉。比如可以利用层把地图的一部份在冬天和夏天之间进行切换。

但每一个瓷砖层都会带来额外的系统开销。每个层都会被渲染,从而影响游戏运行性能。建议层的数量越少越好。对大多数游戏而言,2到4个瓷砖层已经够了。

在添加了新层和设置完层中的瓷砖以后,要确保在真实设备上做个测试,看一下游戏的帧率是否正常。
有的层在游戏中被用于判断瓷砖的某些属性,比如游戏事件层只是cocos2d用来为某些瓷砖确定属性的,所以不需要渲染这个层,通过eventLayer.visible = NO来隐藏这个层。


瓷砖的“全局标识符”(GIDs)概念。瓷砖地图上的 每一块瓷砖都附带一个独有的整数编号,也就是GID。地图上的瓷砖GID是从1开 始连续编号的。GID为0表示的是空白瓷砖,也就是没有瓷砖。利用CCTMXLayer 的tileGIDAt方法,你可以获取层中指定坐标上瓷砖的GID编号。
CCTMXTiledMap有一个叫做propertiesForGID方法,如果指定GID编号的瓷砖附 带属性的话,此方法会返回一个NSDictionary字典。这个NSDictionary字典包 含了在Tiled中为瓷砖添加的属性(见图10-8)。
字典的键/值都是用NSString 对象存储的。调试看一下字典里到底有什么东西,使用CCLOG将字典打印出来。CCLOG(@"NSDictionary 'properties' contains:\n%@", properties);

90度角瓷砖地图的瓷砖坐标是从 左上角开始算起的-也就是左上角是瓷砖地图的原点(0,0),
即(列,行)

碰撞层:用于测试某一块是否允许角色通过,这个层不应该可见。所以在加载地图后,应该立即隐藏这个层。
添加一个新tile层,将Opacity滑块移动到中间,选一块颜色特殊的瓷砖,右键增加属性blocks_movement值为1。选中这个碰撞层,在和地图层对应上的房子,树,山等处画出瓷砖,

mapSize:{30, 20},tileSize : {32, 32}
mapSize: 地图有多少列瓷砖,多少行瓷砖
tileSize: 每行瓷砖的宽度,每行瓷砖的高度
CCLOG(@"mapSize:%@,tileSize : %@",NSStringFromCGSize(INSTANCE.tiledMap.mapSize),NSStringFromCGSize(INSTANCE.tiledMap.tileSize));


遍历瓦片地图的所有子成员,并调用setAliasTexParameters,对瓦片地图中的所有纹理元素关闭抗锯齿效果,这样能保证纹理的像素风格,即便地图缩放的时候也是如此。
for(CCTMXLayer *child in [_tileMap children])
{
        [[child texture] setAliasTexParameters];
}


游戏地图的实现方式,最常见的三种方式是:整图;Tile元素拼装;栅格化切片。
(1)整图
概念解释:所谓整图加载很好理解直接加载一张背景图。
适合形式:小场景,因为太大的图片会导致加载时间过长,用户体验不好。 另外即使加载了,玩家不一定会移动去看,也造成加载浪费。
优       点:程序实现简单,画面精致。
缺       点:首次加载时间较长,有局限性。
(2)Tile元素拼装
概念解释:地图是由很多个标准菱形 拼接起来的。
适合形式:这种实现方式无论场景大小都试用,当地图元素中有很多相同素材(譬如草地),我们就只需要加载一个素材来拼接完成。
优       点:程序美术资源包小且加载时间短。
缺       点:程序实现相对复杂,另外美工在制作时需考虑衔接的合理性和美观性。拼接的时候我们可能需要反复调试美观性。
(3)栅格化切片
概念解释:背景图还是一张整图,在实现上将大图切分成若干小图,根据场景坐标动态加载需要显示的小块地图。
适合形式:大场景地图。
优       点:结合动态加载,减少第一次加载时间,以及避免加载浪费。
缺       点:程序实现相对复杂。

从程序实现角度来说实际上只算是两类:整图和分块,重点表现在资源加载上。
无论是Tile拼接还是栅格化切片只不过是前期资源准备和配置文件不同,真正程序运行的实现方式还是一样。
‍栅格化切片相对简单,只需要做个切图工具,按规格切图就好;而Tile拼接我们就需要借助工具反复调整来确定一张好的地图来,相对繁琐。有点自然是加载时间短,资源包小。‍
‍总之,无论是整图加载还是分块加载,根本没有孰优孰劣的说法。我们可以根据游戏的需求来选择不同的实现方式,即使在同一个游戏中,也可以根据不同的场景来选择不同的实现方式。所以,我们在设计地图加载功能类的时候都会把这两种方式都设计进去。

在地图编辑器中,tile块的属性不要出现空的一行,可用delete键删除。否则在cocos2dx中解析出现错误。

猜你喜欢

转载自wwk.iteye.com/blog/1694755