快速业务通道

Flash AS3教程:不规则形状对象的碰撞测试

作者 佚名技术 来源 服务器技术 浏览 发布时间 2012-07-07
play.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);
// create an opaque bitmap
var bmpd1:BitmapData = new BitmapData(300, 200, false, oxffffff);
bmpd1.fillRect(new Rectangle(100, 50, 100, 100), oxffoooo);
var bmp1:Bitmap = new Bitmap(bmpd1);
addChild(bmp1);
// create a transparent bitmap
var bmpd2:BitmapData = new BitmapData(300, 200, true, OxOOffffff);
bmpd2.fillRect(new Rectangle(100, 50, 100, 100), OxffffOOOO);
var bmp2:Bitmap = new Bitmap(bmpd2);
bmp2.y = 200;
addChild(bmp2);
}
}
}
这段代码首先在场景上画一组随机的线条,以便区分场景和位图。然后创建两个位图,并在
各位图的中央画上红色的方块。上面的位图是不透明的,会完全覆盖所有线条。下面的位图是透
明的,所以只有红色方块覆盖了场景中的线条。其结果如图1-1所示。

图1-1 上面是不透明位图,下面是透明位图
另外,对于透明位图还可以使用部分透明度。对以上代码示例中的第二个fillRect语句做如
下修改:
bmpd2.fillRect(new Rectangle(100, 50, 100, 100) , Ox80FFOOOO);
注意,这里使用了一个32位AARRGGBB颜色值来填充, α值减半为Ox80 ,即十进制数128 。
这样红色方块就会变得半透明,如图1-2所示。

图1-2 一个半透明的方块 《Flash ActionScript 3.0 动画教程》中介绍了几个碰撞检测的基本方法,包括内置的hitTestObject和hitTestPoint方法,以及基于距离的碰撞检测。以上各种方法分别适用于不同形状的参与碰撞检测的对象。hi tTes tObject方法非常适合检测两个矩形对象之间的碰撞,但是对于其他形状往往会生成假警报。hi tTestPoint方法适用于以下两种情况:查看鼠标是否位于一个特定对象之上,或者一个很小的点状对象是否与任何其他形状的对象发生碰撞,但是这个方法对于检测两个较大的对象则束手无策。基于距离的碰撞检测非常适于处理圆形对象,不过对于其他形状的对象常常会产生碰撞漏检。
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, hei

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号