如果要检测两个png图(有透明区域)精确碰撞,用bitmapData.hitTest方法:
1.把两个位图(已放入mc,名叫mc1,mc2)转为bitmap.
2.利用hitTest方法,接受参数
1).mc1左上角的位置;
2).mc1要检测的透明度(0-255);
3).mc2左上角的位置;
4).mc2要检测的透明度
var bmd1:BitmapData = new BitmapData(mc1.width,mc1.height,true,0);
bmd1.draw(mc1);
var bit1:Bitmap = new Bitmap(bmd1);
var bmd2:BitmapData = new BitmapData(mc2.width,mc2.height,true,0);
bmd2.draw(mc2);
var bit2:Bitmap = new Bitmap(bmd2);
//检测相交
addEventListener(Event.ENTER_FRAME, enterFrame);
function enterFrame(e:Event):void
{
mc1.x = mouseX;
mc1.y = mouseY;
if (bmd1.hitTest(new Point(mc1.x,mc1.y),255,bmd2,new Point(mc2.x,mc2.y),255))
{
//如果相交返回true
trace("碰撞");
mc2.filters = [new GlowFilter()];
}
else
{
mc2.filters = [];
}
}
//上面的用255的值是因为想要检测的是mc1中的不透明区与mc2中的不透明区是否碰撞。
//如果两个都改为0,则是检测完全透明区之间是否碰撞。如果是0和255,则不透明区与透明区之间。
//上面的代码有个问题:像帮助里说的:bitmapData.hitTest在执行点击测试时,
//将不会考虑两个对象中任何一个对象的拉伸、旋转或其它变形
//也就是说就算你旋转了,它也还是认为你没有旋转的那个,
//注意到draw方法里还有一个参数,叫矩阵
function hitTest(mc1:MovieClip,mc2:MovieClip):Boolean
{
var rect1:Rectangle = mc1.getBounds(this);//这里要用rect的宽度才合适了
//trace(this);
var bmd1:BitmapData = new BitmapData(rect1.width,rect1.height,true,0);//返回的矩阵也是变化的
var matrix1:Matrix = mc1.transform.matrix;
matrix1.tx = mc1.x - rect1.x;
matrix1.ty = mc1.y - rect1.y;
bmd1.draw(mc1);
var bit1:Bitmap = new Bitmap(bmd1);
var rect2:Rectangle = mc2.getBounds(this);
var bmd2:BitmapData = new BitmapData(rect2.width,rect2.height,true,0);
var matrix2:Matrix = mc2.transform.matrix;
matrix2.tx = mc2.x - rect2.x;
matrix2.ty = mc2.y - rect2.y;
bmd2.draw(mc2,matrix2);
var bit2:Bitmap = new Bitmap(bmd2);
if (bmd1.hitTest(new Point(rect1.x,rect1.y),50,bmd2,new Point(rect2.x,rect2.y),50))
{
trace("碰撞了");
mc2.filters = [new GlowFilter ];
return true;
}
else
{
mc2.filters = [];
}
return false;
}