|
SKDD
|
【分享02】AS3实现RPG游戏地图引擎
目前已经完成精确到像素的任意不规则形状的碰撞检测算法。同时也考虑将地图信息转为二维数组以便A*自动寻径。这样在操作上用碰撞,AI上用A*,一定能给玩家带来完美的游戏体验。
这里的碰撞检测主要依靠封装好的类PPCD(perfectPixelCollisionDetection),它的接口如下: 类PPCD: 1. 返回发生碰撞的矩形边界:
2. 返回发生碰撞的矩形边界的中心点:
3. 验证两个对象是否碰撞:
参数说明: 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/5e623263db64892c8542d6201b58544e3767b05207070000 http://www.fs2you.com/files/98e07085-49dc-11dd-b7b8-0014221f4662/ 2. 纯演示动画,看就好。^-^ http://www.namipan.com/d/6456a50a06e021ecb4c482a4b2fa5cbda4e56ea196070000 http://www.fs2you.com/files/98f32f1c-49dc-11dd-991f-0014221f4662/ 有了这样一个强大的类,像素级的碰撞检测就不成问题了。不过因为PPCD类返回的是边界矩形,以及人物可以在不同的方向以不同的方式碰撞,再加上人物碰到障碍物之后需要有一定的自动“滑动”的功能,碰撞检测的逻辑还是挺复杂的,下面简要介绍一下。 碰撞检测逻辑 比较长和复杂,因为碰撞情况很多,准备好@_@哦? ^^b 详细算法在5楼和6楼,帖子超长了,呵呵。 SWF效果预览: 曲线为主: http://www.namipan.com/d/9862425238a395c6e755e060c930dd6a5c4fd2276e1b0000 http://www.fs2you.com/files/98fb1375-49dc-11dd-998c-0014221f4662/ 直线为主: http://www.namipan.com/d/4205132b47d0c5c55c423572824d6b458a61e8386d1b0000 http://www.fs2you.com/files/98fda719-49dc-11dd-9109-0014221f4662/ 源文件:http://www.namipan.com/d/f960d7b6403f186fb3887603d6560799d0efcb500c930100 http://www.fs2you.com/files/99003323-49dc-11dd-9d8e-0014221f4662/ 目前没有发现BUG,不过还没有经过仔细调试,不敢保证完美。如果有朋友不幸遇见BUG了M我一下呀,谢谢咯~~ ^-^ SKDD 最后编辑于 2008-07-04 23:19:21
|
|||||||||||||||||||||||||||||||||||||||||||||
|
|