2D横版地图碰撞实现

1. 看过很多横版游戏关卡代码例子,关于边界检测,很多就给一个大的长方形,然后根据这个长方形的长宽去判断边界。最近想让边界呈多边形形状,而且有做世界地图的想法,让角色在大地图上自由移动,很明显一个长方形就无法满足自己的需求了。

2. 我的想法:

0)构建地图,用线段去构建各种形状的游戏中的玩家可碰撞的物体,得到一个线段集合。

1)X方向:在玩家当前位置的点,向前拉一条一定长度(这个根据需求确定到底要多次,我现在用的是1136的长度,因为最初做的时候我用5s,一般情况下这个长度不会出现穿越的问题)的线段,检测和所有边界线段是否相交(如果平行于X轴,则舍去不检测),如果相交,记录这个交点的x值X0,如果玩家是x轴正方向走动,则每次得到的交点取x较小的值为准,如果是x轴负方向走动,则取较大值。当所有边界线段检测完毕以后,得到需要的X0值,和当前的位置的x值加上变化的DeltaX,如果超过了这个X0,则使用得到的X0 – 1(-1是为了不让玩家的位置落在边界线段上,造成不必要的特例判断), 如果没有超过,就使用原来的x值加上DeltaX。如果和所有线段都没有交点,则也是原来的x值加上DeltaX。

2)Y方向的算法类似。但是有一个比较特殊的点,就是例如:

一个玩家的包围盒是一个正方形,当检测上下移动的时候,需要检测下方左右两个点(而不像x方向只要检测最靠前进方向的那一个点),取两个点y值更小(如果是往Y轴负方向移动则是取y值更大的)作为得到的y值去做判断。(我觉得这是横版游戏一个很特别的地方,一开始由于一直越界,没有得到按照自己想法的实现,找了一会儿才找到原因)

关于穿越(穿墙)

原本打算以玩家为中心点,往两边(上下)各拉一条很长的线段,把这个整条线段和场景内的线段的交点得到一个此玩家的可到达位置区间,但后来发现这样逻辑会显得不直观,而且感觉会比上面的方法更难实现,并且其实最终还是解决不了“非常极端”的情况下的穿墙问题。所以还是使用了上面的方法。

但其实,把线段长度保持在一个合理的长度内,一般情况下也不会出现穿墙现象。

点赞