精确碰撞检测 bitmapData.hitTest

如果要检测两个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;
}

原文地址:https://www.cnblogs.com/602147629/p/1912953.html