在最近的项目中,需要用到碰撞测试的知识,故特意去看了《as动画基础》、《as高级动画》,并看了网上的帖子,小有斩获。
对象与对象的碰撞测试,主要使用三种方法:
1.
DisplayObject.hitTestObject(obj:DisplayObject)
该方法的测试效率最高,但精确度最低,只对矩形物体有效,不规则物体的碰撞测试,这个方法无能为力。
2.
BitmapData.hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean
该方法是《as高级动画》上介绍的,通常的做法是定义2个BitmapData对象bmpd1和bmpd2,
分别为new BitmapData(stage.stageWidth, stage.stageHeight, true, 0),bmpd1.draw(obj1, obj2.transform.matrix);bmpd2.draw(obj1, obj2.transform.matrix);
isHit = bmpd1.hitTest(new Point(), 255, bmpd2, new Point(), 255);进行碰撞测试。
3.
BitmapData.getColorBoundsRect(mask:uint, color:uint, findColor:Boolean = true):Rectangle
该方法非常巧妙,需要定义1个BitmapData对象,draw的时候:bmpd.draw(obj1, obj1.transform.matrix, new ColorTransform(1, 1, 1, 1, 255, -255, -255, 255)),将bmpd1绘制成红色;
之后,继续在bmpd上绘制,bmpd.draw(obj2, obj2.transform.matrix, new ColorTransform(1, 1, 1, 1, -255, 255, 255, 255), BlendMode.DIFFERENCE),采用青色绘制,并且采用"difference"的混合模式;
这样绘制后,若有重叠,重叠色为白色。之后采用var rect:Rectangle = bmpd1.getColorBoundsRect(0xFFFFFFFF, 0xFFFFFFFF, true);若rect.width>1,便可确认是否碰撞。
这三种方法需要分情况使用,若测试的对象为矩形,使用方法1最合适,效率最高;若测试的对象为不规则图形,可使用方法2或方法3.
之后介绍两种网上高手写的碰撞测试方法,这两种方法均是对上面第三种方法的延伸、扩展。
1.
HitTest.complexHitTestObject(target1:DisplayObject, target2:DisplayObject, accurracy:Number = 1):Boolean
这是tink写的一个像素级碰撞检测类,做了良好的封装,使用简单。
最上面方法3的优化主要在于,BitmapData对象的消耗主要在创建BitmapData对象的大小上,越大消耗越大,tink写的方法,首先先计算了两个物体的矩形所占位置的重叠部分,BitmapData只新建大小为该重叠部分的大小,故消耗大大减小。
2.
BitmapHitTestPlus.complexHitTestObject(target1:DisplayObject, target2:DisplayObject)
这是Aone在tink的HitTest的基础上优化效率后的碰撞检测,整体思路是一样的,效率优化时在计算两个物体矩形重叠部分上更进一步。采用分块的思路分别计算,见效计算量。但是,经我实际使用和测试,该方法虽然比tink的方法效率高,但是精确度不够,需要改进,或根据情况使用。
我的代码间附件。在写这篇帖子之前,看到leng6666写了一片类似的帖子 谈谈碰撞测试(上),他写的比我详细,可以相互借鉴。
水平有限,有不足的地方也希望大家帮我指出!
ps:javaeye的编辑器真不爽……
分享到:
相关推荐
这是我做的一个小节,希望能给大家一个帮助
成大事者应拘小节辩论材料.docx
C#\楚广明C_#简明教程]\第二讲面对对象第四小节.rar )
八年级政治下册 第123小节测试题1 人教新课标版.doc
这些都是我从2010年到2015年 flex工作经验小节。如远程对象的配置, flex 默认右键 菜单的屏蔽, datagrid 的渲染器, 编辑器。 tip 提示的重写。 Menu 的默认样式改写, 比如把分割线变细,flex 组件的生命周期,...
C# ComboBox控件用法小节
ssh第二小节总结
电路分析章节小节word格式电路分析章节小节word格式
"《人口增长模式及地区分布》小节测试题[收集].pdf" 这篇测试题涵盖了人口增长模式、地区分布、人口年龄结构、人口增长率、人口老龄化等多个方面的知识点。 首先,测试题中提到了人口增长模式的分类,包括传统型、...
58小节网络营销.pptx
对架构师的各个方面分小节进行详细的讲解,是个还好的资源
tian工作报告小节3.pdf
hibernate分页查询小节。轻松掌握hibernate
2.2 需求分析任务:在这一小节中,我们将讨论软件测试超市进销存管理系统的需求分析任务,包括需求收集、需求分析和需求规范等内容。 2.3 用况分析:在这一小节中,我们将讨论软件测试超市进销存管理系统的用况分析...
面试前的小节勿忽视.doc
02-各小节说明与总结.pdf
C#\楚广明C_#简明教程]\第三讲第六小节.rar )
对虚拟机中linux连接上网的问题个人进行了小节,
初中语文文摘历史行正道何必拘小节