cocos2d-x游戏实例(4)-地图碰撞

时间:2024-04-08 16:11:17

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man

这篇继续上一篇的内容,继续地图碰撞,上一篇我们得到了我们所处位置的地图索引,这样我们就可以知道我们要控制的角色的位置对应的地图索引值了,那么如何知道我们这块地图是可以去的还是碰撞呢,这里我介绍两种办法

1.分层法

我觉得这个更适合45度角的地图,因为如果使用后一种办法,把所有的图素宽放在一层里的话,会有遮挡这个问题的,当然不是说第二种不能只不过我们把地图的碰撞图素放在一层里我们会把相应的表现图素放在新的一层里,所以还是要分层。

首先看第一种情况的地图,如下图

cocos2d-x游戏实例(4)-地图碰撞

就是新建一层Tree层,把所有的树(这里不能碰撞的图素),grass层铺满草,这里人可以在草中移动,检测碰撞的代码如下:

cocos2d-x游戏实例(4)-地图碰撞

首先通过convertto2d函数获得主角在地图上的索引值,这里为了方便,我把索引值也做成CCPoint的类型了,但是事实上,它并不是一个CCPoint,然后获得Tree层,然后根据索引及tileAt函数获得在该位置的图素,如果他不为空,则证明这个位置是不可碰撞的,那么我们就回滚刚才的移动位置操作,并停止该位置的移动即可。这种方法解决起来相对简单。

2.地图GID及属性法

这种方法应该是更为“正统”的,首先在地图上建一层,如下

cocos2d-x游戏实例(4)-地图碰撞

只是建一层,然后我们在图素上新建属性,我们建一个叫“conflict”属性,并为他设定不同的值即可。

cocos2d-x游戏实例(4)-地图碰撞

我们把不可碰得设为1,把可碰的设为0。代码如下:

cocos2d-x游戏实例(4)-地图碰撞

我们首先或取GID,其实我们可以根据gid直接判断哪些可碰哪些不能通过。但是为了演示如何获得属性,我们还有之后的代码,通过gid获得属性,属性是一组键值对,然后获得conflict值,这样我们就可以判断了

如有错误之处,希望大家多多指正

下一篇继续游戏实例