快速业务通道

Flash AS3教程:使用BitmapData.hitTest 测试非位图对象

作者 佚名技术 来源 服务器技术 浏览 发布时间 2012-07-07

在到目前为止的所有例子中,我们一直都直接使用Bitmap对象作为要移动和测试的显示对象。但是在很多情况下(几乎是大多数情况),实际上会移动不同类型的显示对象,如MovieClip 、Sprite或Shape对象。由于不能对这些类型的对象完成上述碰撞测试,因此需要对设置稍做修改。具体策略是维护一些隐式时tmapData对象,但是不放在显示列表中。每当需要检查两个实际显示对象之间是否存在碰撞时,将显示对象分别绘制到一个位图上,并对位图进行碰撞测试。 应该认识到,使用位图完成碰撞检测并不是唯一的办法,也不一定是最好的做法。还有几十种可能的方法,当然使用位图完成碰撞测试确实能得到想要的效果。可以原样使用这种方法,也可以在它的基础上加以改进。下面是由tmapCollision3类:
package
{
import Flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.MouseEvent;
import flash.filters.GlowFilter;
import flash.geom.Matrix;
import flash.geom.Point;
public class BitmapCollision3 extends Sprite
{
private var bmpdl:BitmapData;
private var bmpd2:BitmapData;
private var starl:Star;
private var star2:Star;
public function BitmapCollision3()
{
stage.align = StageAlign.TOP_lEFT;
stage.scaleMode = StageScaleMode.NO_SCAlE;
// make two stars, add to stage
starl = new Star(50);
addChild(starl);
star2 = new Star(50);
star2.x = 200;
star2.y = 200;
addChild(star2);
// make two bitmaps, not on stage
bmpd1 = new BitmapData(stage.stageWidth, stage.stageHeight, true, O);
bmpd2 = bmpd1.clone();
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoving);
} private function onMouseMoving(event:MouseEvent):void
{
// move star1 to the mouse position
star1.x = mouseX;
star1.y = mouseY;
// clear the bitmaps
bmpd1.fillRect(bmpd1.rect, O);
bmpd2.fillRect(bmpd2.rect, O);
// draw one star to each bitmap
bmpd1.draw(star1, new Matrix(1 , 0, 0, 1, star1.X, star1.V));
bmpd2.draw(star2, new 问atrix(1 , 0, 0, 1, star2.x, star2.Y));
// the hit test itself.
if(bmpd1.hitTest(new Point(), 255, bmpd2, new Point(), 255))
{
star1.filters = [new GlowFilter()];
star2.filters = [new GlowFilter()];
}
else
{
star1.filters = [];
star2.filters = [];
}
}
}
} 在这个构造函数中,我们建立了两个BitmapData对象和两个五角星。没有必要把BitmapData对象放在Bitmap中,因为它们不会加 入到显示列表。另一方面,五角星确实要增加到显示列表。第一个五角星starl会随鼠标移动。每当鼠标移动时,两个位图都使用fillRect并传入颜色 值0来清空。要记住,如果α通道未指定,则取值为0 ,因此其结果等同于令所有像素完全透明。接下来,将每个五角星给制到其相应的位图上:
bmpd1.draw(star1, new Matrix(1, 0, 0, 1, star1.x, star1.Y));
bmpd2.draw(star2, new Matrix(1, 0, 0, 1, star2.X, star2.Y)); 矩阵使用五角星的X和y位置作为平移值,这样一来,各个五角星就会绘制与原场景中相同的位置上。现在可以完成碰撞测试:
if(bmpdl.hitTest(new Point(), 255, bmpd2, new Point() , 255)) 由于BitmapData不在显示列表上,甚至不在Bitmap包装器中,而且由于两个五角星都位于相同的坐标空间,并分别以其相对位置绘制到各BitmapData上,因此不需要做任何坐标空间修正。 只需为每个Point参数分别传入一个新的默认Point (其X和y均为0) 。这里仍保留α阑值为255 ,因为两个五角星都是完全不透明的。 尽管这个例子看上去与其他例子没有两样,但实际上已是截然不同,因为位图不可见,而五角星是可见的。不过二其工作方式完全相同。 这些只是使用BitmapData.hitTest对非圆形、矩形或点状对象完成碰撞检测的几个例子。我相信,一旦了解其工作原理,你肯定能想出更多更酷的改进用法。 接下来,讨论如何完成大规模的碰撞检测。
关键词:位图 AS3 BitmapData hitTest

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号