Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как исключить прозрачную часть BitmapData? (http://www.flasher.ru/forum/showthread.php?t=203547)

klzm 28.09.2013 10:54

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

C4Grey 28.09.2013 16:46

Да, можно, при помощи этого метода.

Akopalipsis 28.09.2013 16:52

Цитата:

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

Zebestov 28.09.2013 17:39

Akopalipsis, где по ссылке про координаты овала?

Wolsh 28.09.2013 17:45

"координаты овала"?

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

Код AS3:

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 перепутал.


Часовой пояс GMT +4, время: 20:42.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.