android游戏开发框架libgdx的使用(十四)—TiledMap中视角完善和障碍物处理

13 1月

本文使用的libgdx是0.92版本,和现在的最新版可能有一些不一样的地方。全文内容仅供参考。

本文紧跟上文:http://www.cnblogs.com/htynkn/archive/2012/01/13/libgdx_13.html

上文说到绘制了Map,然后我们的主角也可以四处活动了,但是仍有一些不完善的地方。

1.地图的边界没有控制。Camera的位置其实是viewport的位置,不是屏幕边界,所以如果直接按照上文的做法做的话主角走到屏幕边缘的时候就有问题了。

zuobiao

2.没有障碍,主角的行动没有约束。

现在先来解决第一个问题。

解决方案很简单,我们时刻注意viewport的位置,根据viewport计算Screen的边界,让其不超过地图。

代码如下:


运行一下,恩,感觉还行。但是又有一个问题出现了,当地图达到边界时地图不能滚动了,但是主角应该还是可以前进的。

13-1

处理方法我采用的是将Camera和主角分开处理,还是判断一下,主角如果移动后不超出屏幕,就继续移动。


13-2

第一个问题基本解决,为什么说是基本解决?因为主角和Camera的位置可能会变动。造成主角在屏幕一角行走的问题。我一般是判断主角位置,当位于中心区域时在让二者联动。

现在来解决第二个问题,障碍物的问题。

重新编辑我们的TMX文件。添加一个新图块:

metatiles

大小还是32*32.

13-3

然后新建一个图层,将地图中不能穿越的部分用红色的方块填充。

tilemap

编辑红色块的属性,添加一个Pass-False键值(这个值是随意的,只要你能懂就行)

13-4

最后隐藏该图层,保存文件。(我在Editor里面确实隐藏了这个层,但是libgdx还是绘制了,只有自己处理一下了)


map实例化以后,先寻找我们的障碍层,将其从map中移除。为了方便调试,暂时没有移除它。

在主角每次移动时我们就检查主角移动后的位置是在哪块里面,这块是不是不能通过的,如果不能就不移动,否则就移动。

先遍历所有tiles,看一下pass=false的是多少ID的那块。


然后推算移动后会处于哪块中,哪一块是不是不能通过的


在移动时先判断一下,如果会达到不能到达的块就直接退出


完整代码:(代码有点乱)


最终效果:

13-5

写在最后:

  • 调试好了就要在绘制前把障碍层删除。

  • 注意各种坐标转化。

  • 如果需要变化地图,直接操作Layer里面的那个二维数组。

本文用的检测方法只是一种可行方案而已,也可以直接看角色占的块数。

本文参考了:http://geekanddad.wordpress.com/2010/06/22/enemies-and-combat-how-to-make-a-tile-based-game-with-cocos2d-part-3/

发表评论

电子邮件地址不会被公开。