在最近的项目中,需要用到碰撞测试的知识,故特意去看了《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的编辑器真不爽……
分享到:
相关推荐
MVC模式则更侧重于分离关注点,使代码更加可测试和可维护。 3. **界面元素处理** 在ASP.NET中,我们可以使用服务器控件来构建用户界面。这些控件如Button、TextBox、Label等,具有内置的事件处理和状态管理功能。...
成大事者应拘小节辩论材料.docx
教程分为多个小节,每个小节专注于一个特定的主题,以便于理解和吸收。以下是对各小节主要内容的详细介绍: 1. **架构师的角色与职责**:在这个章节,我们将讨论架构师在软件开发过程中的核心职责,包括技术领导、...
这些都是我从2010年到2015年 flex工作经验小节。如远程对象的配置, flex 默认右键 菜单的屏蔽, datagrid 的渲染器, 编辑器。 tip 提示的重写。 Menu 的默认样式改写, 比如把分割线变细,flex 组件的生命周期,...
"《人口增长模式及地区分布》小节测试题[收集].pdf" 这篇测试题涵盖了人口增长模式、地区分布、人口年龄结构、人口增长率、人口老龄化等多个方面的知识点。 首先,测试题中提到了人口增长模式的分类,包括传统型、...
58小节网络营销.pptx
tian工作报告小节3.pdf
2.2 需求分析任务:在这一小节中,我们将讨论软件测试超市进销存管理系统的需求分析任务,包括需求收集、需求分析和需求规范等内容。 2.3 用况分析:在这一小节中,我们将讨论软件测试超市进销存管理系统的用况分析...
系统规划师第一小节 信息系统
在本讲中,我们将深入探讨C#编程语言中的面向对象特性。C#,全称CSharp,是由微软公司推出的、用于构建Windows平台上的应用程序的现代编程语言。它以其强大的面向对象编程能力,丰富的库支持以及与.NET框架的紧密...
在本节教程“第三讲第六小节”中,我们将深入探讨C#编程语言的一些关键概念。C#(读作"C sharp")是由微软公司开发的一种面向对象的编程语言,广泛应用于构建Windows桌面应用、Web应用以及游戏开发等领域,尤其是与...
02-各小节说明与总结.pdf
对虚拟机中linux连接上网的问题个人进行了小节,
初中语文文摘历史行正道何必拘小节
这篇博客主要讨论的是Struts2中的标签小节,下面我们将深入探讨这一主题。 首先,Struts2的标签库是基于JSP标准标签库(JSTL)的,它扩展了JSP的功能,使得在页面中处理业务逻辑和展示数据变得更加简单。这些标签...
### SSH 第二小节知识点总结 #### 一、表空间概念与分类 ##### 定义 - **表空间**:数据库逻辑结构中的一个重要概念,它用于存放各种应用对象(如表、索引等)。每个表空间由一个或多个数据文件组成。 ##### 目的...
总的来说,"net开发小节:权限管理.zip_快速开发框架"中的内容可能涵盖从理论到实践的各个层面,包括设计、实现、测试和优化权限管理系统,这对于提升.NET开发者的技能和理解快速开发框架的能力大有裨益。...
本项目"metronome-measure"是一个JavaScript实现的节拍器,旨在提供一个带有小节计数功能的增强版节拍器,特别适合于跟踪如12小节布鲁斯这样的重复结构,避免在即兴演奏时失去节奏感。 首先,我们需要理解...