求Flash AS3 像素级碰撞检测 的完整实例,谢谢!

邮箱:qq33923881@126.com
2025-05-09 19:49:20
推荐回答(2个)
回答1:

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shape;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.GlowFilter;
import flash.geom.Point;
[SWF(width="400",height="300")]
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
//两张位图
var bd1:Bitmap;
var bd2:Bitmap;
init();
function init():void {
//画一个小圆
var bdp1:BitmapData=new BitmapData(40,40,true,0);//位图数据,正方形,边长40,背景透明,意思是只是图形有效
bdp1.draw(drowMC());//调用绘图函数,这里一个半径为20的圆
bd1=new Bitmap(bdp1);//将数字图形可视化 成为位图
bd1.x=stage.stageWidth/2;/置于舞台中心
bd1.y=stage.stageHeight/2;
addChild(bd1);//添加到显示列表

//画一个大圆
var bdp2:BitmapData=new BitmapData(60,60,true,0);
bdp2.draw(drowMC(30));
bd2=new Bitmap(bdp2);
addChild(bd2);

addEventListener(Event.ENTER_FRAME,_onMouseMove);
}
function _onMouseMove(e:Event):void {
bd2.x=mouseX;//大圆跟随鼠标
bd2.y=mouseY;

//如果发生像素级碰撞
if (bd1.bitmapData.hitTest(new Point(bd1.x,bd1.y),1,bd2.bitmapData,new Point(bd2.x,bd2.y),255)) {
//这里实现你的梦想:……
//为了让你看到效果,就让两个圆都显示滤镜效果:
bd1.filters=[new GlowFilter ];
bd2.filters=[new GlowFilter ];
} else {
//不发生像素级碰撞,就去掉滤镜效果:
bd1.filters=[];
bd2.filters=[];
}
}
//画圆函数------------------------------------
function drowMC(r:Number =20):Sprite {
var _mc:Sprite=new Sprite ;
_mc.graphics.lineStyle(0);
_mc.graphics.beginFill(0xff0000);
_mc.graphics.drawCircle(r,r,r);
_mc.graphics.endFill();
return _mc;
}

张志晨试答

回答2:

下例将创建一个仅在矩形区域 (20, 20, 40, 40) 中不透明的 BitmapData 对象,然后调用 hitTest() 方法,且使用 Point 对象作为 secondObject。在第一次调用中,Point 对象定义 BitmapData 对象的左上角,是透明的;在第二次调用中,Point 对象定义 BitmapData 对象的中心,是不透明的。
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;

var bmd1:BitmapData = new BitmapData(80, 80, true, 0x00000000);
var rect:Rectangle = new Rectangle(20, 20, 40, 40);
bmd1.fillRect(rect, 0xFF0000FF);

var pt1:Point = new Point(1, 1);
trace(bmd1.hitTest(pt1, 0xFF, pt1)); // false
var pt2:Point = new Point(40, 40);
trace(bmd1.hitTest(pt1, 0xFF, pt2)); // true