精确碰撞检测 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 ;
}

你可能感兴趣的:(bitmap)