精灵的透明部分响应鼠标事件

时间:2010-07-17 20:42:57

标签: flash actionscript-3 mouseevent sprite transparent

我正在使用Flash cs5 / as3制作益智游戏,它可以有自定义拼图形状。 基本上,用户可以绘制拼图的基本突起。 然后我用这样的自定义函数创建一个黑白拼图块

var piece:PuzzlePiece= new PuzzlePiece(true,true,false,false);

PuzzlePiece是一个扩展Sprite的类。这四个参数对应于拼图的四个边(上,下,左,右)。如果参数为真,则意味着突出物应该伸出拼图块的那一侧。如果它是假的,它应该在那一侧有一个洞,所以它适合突出 我首先附着伸出的突起,然后我翻转插入的突起,将它们连接到一个新的精灵(in_part)并使用以下功能将它们反转:

in_part=invertSprite(in_part,in_part.widht,in_part.height);
function invertSprite(source:Sprite, width: int, height: int) {
var child:Shape = new Shape(); 
child.graphics.beginFill(0xFFFFFF);
child.graphics.lineStyle();
child.graphics.drawRect(0, 0, width,height);
child.graphics.endFill();

var cont:Sprite = new Sprite();
cont.addChild(child);
cont.addChild(source);
source.blendMode = BlendMode.ERASE;
cont.blendMode = BlendMode.LAYER;
return cont;
}

我将两部分组合在一起,结果是黑白拼图。

然后,我想将这件作为蒙版应用于加载图像的一部分。

puzzleImg = Bitmap(loader.content).bitmapData; // this is the .jpg image 
var width = piece.width; // piece is black and white Sprite in the shape of the puzzle 
var height = piece.height;

var puzzlePc:BitmapData = new BitmapData(width,height,true,0);
puzzlePc.draw(puzzleImg);
disp = new Bitmap(puzzlePc);
tmp.addChild(disp); //tmp is the main, holding Sprite
addChild(piece);
disp.mask = piece;
disp.cacheAsBitmap = true;
piece.cacheAsBitmap = true;
tmp.mouseChildren = false;

这一切都很好,除了拼图中的洞(其他拼图应该适合的透明部分)响应鼠标点击,这显然不利于我的意图。

我现在试图解决这个问题几天,但我真的不明白为什么会这样。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

在鼠标处理程序中,您可以检查单击鼠标点下像素的Alpha值。如果该值小于那么完全alpha取消任何功能。

protected function onMouseDown( event:MouseEvent ):void
{
    var pixelValue:uint = _bitmap.bitmapData.getPixel32( event.localX, event.localY );
    var alphaValue:uint = pixelValue >> 24 & 0xFF;

    trace( 'alphaValue: ' + alphaValue );
    trace( 'pixelValue: ' + pixelValue );

    if( alphaValue < 255 ) {
        trace( 'clicked area is not opaque' );
    } else {
        trace( 'clicked area is opaque' );
    }
}

答案 1 :(得分:1)

我相信你可以使用BitmapData.hitTest函数。使用此功能,您可以针对位图测试点或针对位图测试位图。

答案 2 :(得分:1)

Group有一个属性mouseEnabledWhenTransparent,将其设置为true。

如果使用FXG将它们包装在一个组中

<s:Group mouseEnabledWhenTransparent="true">
<someRandomComponentWithTransparency/>
</s:Group>