Flash AS3教程:不规则形状对象的碰撞测试
作者 佚名技术
来源 服务器技术
浏览
发布时间 2012-07-07
个特定对象之上,或者一个很小的点状对象是否与任何其他形状的对象发生碰撞,但是这个方法对于检测两个较大的对象则束手无策。基于距离的碰撞检测非常适于处理圆形对象,不过对于其他形状的对象常常会产生碰撞漏检。 Flash中实现碰撞检测的理想方法(相当于这个领域的"圣杯" )是对两个不规则形状的对象进行相互测试,从而准确地知道它们是否接触。从Flash 8 开始,已经有一种方法可以通过BitmapData类做到这一点(不过《Flash ActionScript 3.0 动画教程》中没有讨论这种方法)。实际上,这种方法有一个很贴切的名字hi tTest 。 首先,需要对一些术语做一点说明。ActionScript包含一个时tmapData类,其中保存要显示的具体位图图像,另外还有一个时tmap类,这是包含一个BitmapData 的显示对象,并允许将这个BitmapData添加到显示列表中。在后面的介绍中,如果我特别指出其中某一个类或者某个类的实例,会使用首字母大写的类名(BitmapData或Bitmap) 。不过,通常情况下,我可能会用位固(bitmap)一词不太正式地指一个位图图像。不要把它与Bitmap类相混淆。 BitmapData.hitTest会比较两个时tmapData对象,指出它们的像素是否发生重叠。重申一次,这昕起来很容易,但是如果再多加考虑就会发现其中存在一些复杂性。位图是像素的矩形网格,所以如果只是采用最简单的形式,这个方法不会比作用于显示对象的hi tTestObject方法更复杂(当然同样也不会有太大用处)。只有当使用了绘制有一个形状的透明位图时这个方法才真正有用。 创建一个时tmapData对象时,要在构造函数中明确指定它是否支持透明性: new BitmapData(width, height, transparent, color); 第3个参数是一个布尔值(true/fa1 se) ,这个参数将设置透明性选项。如果将其设置为false,位图就是完全不透明的。最初这呈现为一个用指定背景颜色填充的矩形。可以使用不同的BitmapData方法来改变位图中的任何像素,不过它们总是完全不透明的,井且会覆盖该BitmapData之下的所有内容。各像素的颜色值是一个形式为0成RGGBB 的24位数字。这是一个6位的十六进制数,其中第一对数指定了红色通道的值,取值范围是00 (0) ~FF (255) ,第二对设置了绿色通道,第三对设置蓝色通道。例如, OxFFFFFF是白色,OxFFOOOO是红色, OxFF9900是橙色。要设置和获取单个像素的值,可以使用setPixel 和getPixel 方法,它们都使用24位颜色值。 不过,在BitmapData类中将透明性选项指定为true时,每个像素还会支持一个a3I道,相应地会使用一个格式为OxAARGGBB的32位数。在这里,前两位十六进制数表示一个像素的透明度,00 为完全透明, FF 则是完全不透明。在一个透明的时tmapData 中,需要使用setPixe132 与getPixe132来设置和读取单个像素的颜色。这些方法都取32位数作为参数。需要指出,如果向其中某个方法传入一个24位数, al匾道将计算为0 ,也就是完全透明。 为了了解二者的具体差别,下面分别创建一个例子。可以在一个Flex Builder 3或4版本的ActionScript工程中使用下面的类作为主类,或者在Flash CS3 或CS4 中作为文档类。这个BitmapCompare类可以从本书网站州w.friendsofed.com下载。 import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.geom.Rectangle; public class BitmapCompare extends Sprite { public function BitmapCompare() { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; // draw a bunch of random lines graphics.line5tyle(0); for(var i:int = Oj i < 100j i++) { graphics.lineTo(Math.random() * 300, Math.random() * 400); // crea |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: Flash教程:自制流星雨效果下一篇: Flash AS3制作个性的旋转圆形网页导航
关于Flash AS3教程:不规则形状对象的碰撞测试的所有评论