прозрачные части спрайта, реагирующие на события мыши - PullRequest
2 голосов
/ 18 июля 2010

Я делаю игру-головоломку во 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 ]

2 голосов
/ 18 июля 2010

В обработчике мыши вы можете проверить альфа-значение пикселя под точкой, где нажата мышь.Если значение меньше, то полная альфа отменяет любую функциональность.

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 голос
/ 16 мая 2012

Группа имеет свойство mouseEnabledWhenTransparent, установите для него значение true.

при использовании FXG оберните их в группу

<s:Group mouseEnabledWhenTransparent="true">
<someRandomComponentWithTransparency/>
</s:Group>
1 голос
/ 20 июля 2010

Я полагаю, что вы можете использовать функцию BitmapData.hitTest для этого.С помощью этой функции вы можете проверить точку на растровом изображении или растровое изображение на растровом рисунке.

...