45度角磁砖地图

设计45度角地图最重要的一条规则是:需要为地图设计两个层,这样游戏角色才能在某些瓷砖后面走动。其中一层用来放地面上的物体和地板瓷砖,另一层用来放其它东西,例如与别的瓷砖重叠的瓷砖或者半透明的物品。地面层应该放在Objects层之上。注意在地面层里只放置完全不透明的地板瓷砖。其它物体都要放在Objects层里。

使用90度角图片生成45度角瓷砖:首先,正方形图片会被旋转45度角,然后在y轴方向将它
缩小成典型的45度角瓷砖的钻石形状。
在实际操作中,不能直接把90度角瓷砖直接旋转缩小成45度角瓷砖,因为旋转操作会影响图片里的内容。直接旋转缩小所得到的结果看上去还是2D的,而且视觉上完全不对。
最容易设计的45度角瓷砖是平的地板瓷砖


要给45度角瓷砖地图添加视觉上的深度,需要让瓷砖上画的物体超出钻石状瓷砖的边界。最常用的方法是将物体画成以45度视角观察的3D图形。而且要让物体超出瓷砖的边界,不过最多超出一块瓷砖的大小,玩家只能在同一时间看到瓷砖地图的一部分,45度角瓷砖不会由于离开屏幕远而变小。例如石门的上半部份超出了石门所在的瓷砖,延升到了上面一块瓷砖中,由此创造出视觉上的深度。


因为瓷砖是从后面开始往前渲染的,所以45度角瓷砖地图允许瓷砖相互叠加,这意味着离观看者近的物体瓷砖会叠加在离观看者远的瓷砖上,由此产生深度的感觉。
不过这要求要仔细设计单独的瓷砖和瓷砖地图,因为太多的瓷砖叠加或者叠加了错误的瓷砖会很容易就破坏深度的感觉。不要把形状类似的物体瓷砖叠加在一起,应该使用相同的或者类似的配色方案。例如,不能把水晶瓷砖直接放在石门后面,因为这两者之间缺乏对比,而且它们的轮廓线条还会重叠,从而破坏深度的感觉。

生成一个新的45度角瓷砖地图:Orientation 应该被设置为 Isometric。比较奇怪的是设置Tile size的宽度和高度。例如单块瓷砖的大小是 54x49 像素,钻石形状的大小是 54x27 像素,但是却设置为 52x26 像素。这是因为45度角瓷砖设计的时候考虑到了它们会相互叠加,所以对于大多数45度角瓷砖集来说,当把它们应用到Tiled软件中的地图上时,地图上的瓷砖宽度必须比瓷砖集里的钻石形状的实际宽度小2个像素,高度要小1个像素。使用上述瓷砖大小的像素值差别的目的是让瓷砖地图的边界成为一条直线,避免背景透过瓷砖而显示出来。因为不可能把钻石形状设计成可以让瓷砖之间的距离都相同,而又不相互叠加。


cc_vertexz属性
要想让角色被在它前面的建筑物,墙壁,树木等物体挡住的话,需要在角色移动时改变角色的vertexZ值。

在Tiled中创建物体层(Objects Layer)时,给这个层设置了一个名为cc_vertexz的属性,并且将它的值设为automatic。这个设定会指示cocos2d为物体层的瓷砖分配连续的
vertexZ值。??ertexZ值越小,相应的物体就离屏幕越远

因为在TileMapLayer类中,角色精灵是在加载了瓷砖地图以后再加载的,所以角色精灵会使用以所在瓷砖相同的vertexZ值进行渲染,从而覆盖在瓷砖上面。为了让精灵可以被物体瓷砖覆盖-也就是忍者可以躲到树木,建筑物等后面,我们要将角色精灵的vertexZ值减去1。

提供CC_DIRECTOR_INIT宏命令的原因是大多数游戏初始化cocos2d的时候所需的处理都是一样的。但是,当使用45度角地图时,需要改 变的地方是:首先需要开启OpenGL的depth buffer(深度缓冲),这样就可以对物体的z ordering拥有更好的控制权。其次CCDirector需要用到2D投影才能使用depth buffer。

90度角瓷砖地图的瓷砖坐标是从 左上角开始算起的-也就是左上角是瓷砖地图的原点(0,0)。但是对于45度角 地图,左上角这个原点不再存在了。因为地图被旋转了45度,所以地图顶部的 那块瓷砖成了地图的原点。地图往右下 角的方向,瓷砖的X轴值在增加;往左下角方向的话,则瓷砖的Y轴值增加。在 一张拥有30x30瓷砖的地图中,最底部那块瓷砖的坐标值就是(29,29)。??


不让角色在移动时穿过墙壁和山,需要在Tiled软件中给地图添加一个新层,将层的Opacity滑块移动到中间的位置。右键Tile Properties对话框中,添加一个名为 blocks_movement 的属性,将它的值设为 1。选中Collisions层,使用已经设置了blocks_movement属性的瓷砖,在地图上不让角色通过的地方,画出瓷砖,比如墙壁,山脉,房子等等所处的位置。

NPC就是None Player Character的缩写这是代表非玩家控制的角色。


45度角地图的左尖坐标位置是mapposition(0,0),顶尖位置是tileCoord(0,0)
CCTMXObjectGroup中的指标坐标也是在某个方块的左下点,即菱形的左顶点。

在编辑器上,CCTMXObjectGroup的x,y属性中的值是格子数,但是在cocos2d代码中用读取出来的是自动乘过块大小后在地图上的像素值,即mapposition。

45度斜角地图菱形坐标转换
http://cn.cocos2d-x.org/bbs/forum.php?mod=viewthread&tid=1432
http://www.cppblog.com/wc250en007/archive/2012/07/20/184285.html

猜你喜欢

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