PDA

Просмотр полной версии : Как исключить прозрачную часть BitmapData?


klzm
28.09.2013, 10:54
Я создаю объект BitmapData с прозрачным фоном, в котором отрисовывается, например, овал.
Можно ли сделать так, чтобы объектом стал именно овал, а не прямоугольник BitmapData?
То есть, чтобы я мог перетаскивать мышью овал, кликая именно по нему, а прозрачная часть прямоугольника вне овала не загораживала бы для кликов другие объекты.

C4Grey
28.09.2013, 16:46
Да, можно, при помощи этого (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#hitTest()) метода.

Akopalipsis
28.09.2013, 16:52
Да, можно, при помощи этого метода.
Это Вы координаты овала предлагаете высчитывать? Есть же вроде, что то, что у BitmapData прозрачную область не видит...

Zebestov
28.09.2013, 17:39
Akopalipsis, где по ссылке про координаты овала?

Wolsh
28.09.2013, 17:45
"координаты овала"?

Делал такое для паззлов. Попробую на ходу убрать особенности своей архитектуры.. как то так

package
{
import flash.events.Event;
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
/* * * * * * * * * *
* *
* @author wolsh *
* *
\* * * * * * * * * */
public class InteractiveBitmap extends Sprite
{
private var _image:Bitmap;
private var _bounds:Rectangle;

public function InteractiveBitmap (image:Bitmap)
{
_image = image;
this.addChild(_image); // или this.addChild(new Bitmap(_image.bitmapData));
this.mouseChildren = false;

_bounds = this.getBounds(this);
if (stage) init();
else this.addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(event:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
this.addEventListener(Event.REMOVED, removedHandler);
this.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler, false, 10000, true);
}


/* HANDLERS */
private function removedHandler(event:Event):void
{
stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
}

//// Когда мышь попадает в границы картинки,
private function rollOverHandler(event:MouseEvent):void
{
this.removeEventListener(MouseEvent.ROLL_OVER, rollOverHandler, false);
//// отключаем спрайту реакцию на мышь, чтобы события мыши достигали нижележащих объектов.
this.mouseEnabled = false;
//// Однако слушаем движение мыши через стейдж.
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
}

//// после того, как мышь попала в границы картинки, на каждое движение мыши
private function mouseMoveHandler(event:MouseEvent):void
{
//// проверяем, находится ли еще мышь в границах картинки.
var mousePoint:Point = new Point(this.mouseX, this.mouseY);
//// Когда мышь покидает границы картинки (картинка уже не мешает событиям мыши достигать нижних объектов),
if (!_bounds.containsPoint(mousePoint))
{
//// снова включаем реакцию,
this.mouseEnabled = true;
//// чтобы поймать ролловер в следующий раз.
this.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler, false, 10000, true);
//// и перестаем слушать движение мыши по стейджу
stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
}
else //// если мышь все еще в границах картинки...
{
//// Когда мышь попадает на непрозрачные пиксели картинки, снова включаем реакцию на мышь; когда на прозрачные — снова отключаем.
this.mouseEnabled = _image.bitmapData.hitTest(new Point(), 0x22, mousePoint);
}
}
}
}

Но это только если не нужно обрабатывать наезд мыши (ролловер) визуальными эффектами, то есть если интересуют только mouseDown и mouseUp (для драга только они и нужны). Если нужен весь спектр мышиных событий, ищите класс InteractivePNG в гугле.

Akopalipsis
28.09.2013, 18:27
Akopalipsis, где по ссылке про координаты овала?
Жутко извиняюсь! я с hitTestObject перепутал.