点击这里给我发消息 点击这里给我发消息
首页 > 行业资讯 > flash>详细内容

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

添加时间:2013-12-19
    相关阅读: flash 维护
 

在到目前为止的所有例子中,我们一直都直接使用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对非圆形、矩形或点状对象完成碰撞检测的几个例子。我相信,一旦了解其工作原理,你肯定能想出更多更酷的改进用法。

接下来,讨论如何完成大规模的碰撞检测。


咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册