AS3实现RPG游戏地图引擎

    目前已经完成精确到像素的任意不规则形状的碰撞检测算法 。同时也考虑将地图 信息转为二维数组以便A*自动寻径。这样在操作上用碰撞,AI上用A*,一定能给玩家带来完美的游戏 体验。

这里的碰撞检测主要依靠封装好的类PPCD(perfectPixelCollisionDetection),它的接口如下:


类PPCD:


1. 返回发生碰撞的矩形边界:

  1. getCollisionRect (        target1:DisplayObject,       
  2.         target2:DisplayObject,       
  3.         commonParent:DisplayObjectContainer,
  4.        
  5.         pixelPrecise:Boolean = true,
  6.        
  7.         tolerance:Number = 0        ):Rectangle
复制代码

2. 返回发生碰撞的矩形边界的中心点:

  1. getCollisionPoint (        target1:DisplayObject,       
  2.         target2:DisplayObject,       
  3.         commonParent:DisplayObjectContainer,
  4.        
  5.         pixelPrecise:Boolean = true,
  6.        
  7.         tolerance:Number = 0        ):Point
复制代码

3. 验证两个对象是否碰撞:

  1. isColliding (        target1:DisplayObject,       
  2.         target2:DisplayObject,       
  3.         commonParent:DisplayObjectContainer,
  4.        
  5.         pixelPrecise:Boolean = true,
  6.        
  7.         tolerance:Number = 0        ):Boolean
复制代码

参数说明:

target1,target2:需要做碰撞检测的两个对象;
commonParent:两个对象所在的共同的容器;
pixelPreciese:是否精确到像素。若设置为false,则和DisplayObject.hitTestObject()工作原理相同。
tolerance:容许量,默认为0。这个数值设置开始进行碰撞检测的DisplayObject的最小alpha值。比如有个对象有阴影效果 ,其阴影的alpha值大概在20以下。那么如果在进行碰撞检测的时候不希望把阴影也包含进去,则需要将tolerance设置为20。否则另外一个物体碰到阴影也算有碰撞。


工作原理说明:

1. 找出两个对象边界矩形的交叉区域,若没有则没有发生碰撞
2. 创建一个与交叉区域同样大小的bitmap
3. 将第一个对象相交的部分以红色绘制在bitmap中
4. 将第二个对象的相交部分以白色绘制在bitmap中,BlendMode(混合模式)为DIFFERENCE。
5. 找出颜色为cyan的区域并返回其边界矩形。若没有则说明没有发生碰撞

此算法快速高效,一次检测只需要花2-3ms的时间。详细的算法参见源文件 PPCD.fla,另有2个SWF演示:

1. 拖动小球,当小球碰到不规则物体时碰撞区域的边界矩形会以绿色标记出来,同时bitmap会在左上角显示。注意物体的阴影部分没有参与碰撞检测(合理设置tolerance参数)。
http://www.namipan.com/d/5e62326 ... 44e3767b05207070000
http://www.fs2you.com/files/98e07085-49dc-11dd-b7b8-0014221f4662/

2. 纯演示动画 ,看就好。^-^
http://www.namipan.com/d/6456a50 ... cbda4e56ea196070000
http://www.fs2you.com/files/98f32f1c-49dc-11dd-991f-0014221f4662/

有了这样一个强大的类,像素级的碰撞检测就不成问题了。不过因为PPCD类返回的是边界矩形,以及人物可以在不同的方向以不同的方式碰撞,再加上人物碰到障碍物之后需要有一定的自动“滑动”的功能,碰撞检测的逻辑还是挺复杂的,下面简要介绍一下。


碰撞检测逻辑

比较长和复杂,因为碰撞情况很多,准备好@_@哦? ^^b
详细算法在5楼和6楼,帖子超长了,呵呵。


SWF效果预览:

曲线为主:
http://www.namipan.com/d/9862425 ... d6a5c4fd2276e1b0000
http://www.fs2you.com/files/98fb1375-49dc-11dd-998c-0014221f4662/

直线为主:
http://www.namipan.com/d/4205132 ... b458a61e8386d1b0000
http://www.fs2you.com/files/98fda719-49dc-11dd-9109-0014221f4662/

源文件:http://www.namipan.com/d/f960d7b ... 799d0efcb500c930100
http://www.fs2you.com/files/99003323-49dc-11dd-9d8e-0014221f4662/


目前没有发现BUG,不过还没有经过仔细调试,不敢保证完美。如果有朋友不幸遇见BUG了M我一下呀,谢谢咯~~ ^-^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值