我正在使用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;
这一切都很好,除了拼图中的洞(其他拼图应该适合的透明部分)响应鼠标点击,这显然不利于我的意图。
我现在试图解决这个问题几天,但我真的不明白为什么会这样。
有什么想法吗?
答案 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>