加入收藏 | 网站地图 | | RSS | WAP
你好,游客 登录 注册 搜索
背景:
阅读内容  领跑条码、标签打印软件 | 来电弹出客户资料

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

[日期:2010-12-28] 作者: 来源: [字体: ]

在到目前为止的所有例子中,我们一直都直接使用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 

收藏 推荐 打印 | 录入:blue1000 | 阅读:
本文评论   查看全部评论 (0)
表情: 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事/刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款