8.10.检测像素级别的碰撞

8.10.1. 问题
我需要检查是否有带有alpha 透明度的图像区域与其他图像发生碰撞。
8.10.2. 解决办法
绘制两个图像到一个BitmapData 对象,并使用BitmapData.hitTest 方法。
8.10.3. 讨论
BitmapData 对象拥有一个hitTest 方法,和DisplayObject 定义的hitTest 方法工作方法相似但有一个明显的例外:而DisplayObject 的hitTest 方法返回true,如果点和对象的范围相交,BitmapData 的hitTest 方法返回true,如果点的像素超过了某个透明度的门槛。这里是这个方法的特点:
+展开
-ActionScript
public function hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean

如果一个图像是不透明的,他被这个方法认为是一个完全不透明的矩形,两个图像必须被认为是透明的才能执行像素级碰撞测试。当你测试两个透明图像时,alpha threshold 参数控制alpha 通道的值,从0 到255,被认为是不透明的。这个方法的参数如下:
firstPoint:Point
BitmapData 图像在任意坐标空间的左上角位置。相同的坐标位置被用来定义secondBitmapPoint 参数。

firstAlphaThreshold:uint
在这个测试中被认为是不透明的最高的alpha 通道值。

secondObject:Object
一个矩形,点,位图,或BitmapData 对象。

secondBitmapDataPoint:Point (default = null)
这个点定义了一个在第二BitmapData 对象中的像素位置。只有当secondObject 的值是BitmapData 对象时使用这个参数。

secondAlphaThreshold:uint (default = 1)
在第二个BitmapData 对象中被认为是不透明的最大的alpha 通道值。只有当secondObject的值是BitmapData 对象并且两个BitmapData 对象都是透明的时使用这个参数。

在下面的代码例子中,每一个矩形图形的角上,对一个带有alpha 透明度的PNG 文件进行碰撞测试:
+展开
-XML
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxmlwidth="1500"
height="900">

<mx:Script>
<![CDATA[
import flash.display.BlendMode;
private var mainBmp:BitmapData;
private var dragBmp:BitmapData;
private var hasDrawn:Boolean = false;
private function loaded():void{
if(!hasDrawn){
mainBmp = new BitmapData(
mainImg.width, mainImg.height,true,0x00000000);
dragBmp = new BitmapData(
dragImg.width, dragImg.height, true, 0x00000000);
hasDrawn = true;
this.addEventListener(Event.ENTER_FRAME, showHits);
}
}
private function showHits(event:Event):void
{
mainBmp.draw(mainImg);
dragBmp.draw(dragImg);
if(mainBmp.hitTest(new Point(0,0), 0xff,
dragImg.getBounds(this).topLeft)){
trace(" true ");
return;
}
if(mainBmp.hitTest(new Point(0,0), 0xff,
dragImg.getBounds(this). bottomRight)){
trace(" true ");
return;
}
if(mainBmp.hitTest(new Point(0,0), 0xff, new
Point(dragImg.getBounds(this).left,
dragImg.getBounds(this).bottom))){
trace(" true ");
return;
}
if(mainBmp.hitTest(new Point(0,0), 0xff, new
Point(dragImg.getBounds (this).right,
dragImg.getBounds(this).top))){
trace(" true ");
return;
}
trace(" false ");
}

]]>
</mx:Script>
<mx:Image id="mainImgsource="../assets/alphapng.png"
cacheAsBitmap="true"/>

<mx:Image cacheAsBitmap="trueid="dragImg"
mouseDown="dragImg.startDrag(false, this.getBounds(stage)),
loaded()
rollOut="dragImg.stopDrag()"
mouseUp="dragImg.stopDrag()"
source="../assets/bigshakey.png"/>

</mx:Canvas>

当第一个图像的像素在得到的点没有取得hitTest 方法设置的alpha 值时这些代码返回false。

在图8-1,两个亮的蓝色方块是带有alpha 透明度的PNG 文件。shake 是一个独立的图形,这时候,PNG 中没有足够高alpha 的区域发生碰撞。可是,在图8-2,shake 在一个区域中发生了碰撞并且这个方法返回了true。

加支付宝好友偷能量挖...


评论(0)网络
阅读(87)喜欢(0)flash/flex/fcs/AIR