Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не срабатывает MOUSE_OVER, ROLL_OVER при использовании InteractivePNG (http://www.flasher.ru/forum/showthread.php?t=194723)

Vreden 21.02.2013 00:32

Не срабатывает MOUSE_OVER, ROLL_OVER при использовании InteractivePNG
 
В ряде случаев (мне не удалось найти точную причину) не срабатывают события MOUSE_OVER, ROLL_OVER подписываясь к экземпляру класса InteractivePNG. Не срабатывание событий имеет какую-то закономерность, которую узнать мне также не удалось, т.е. 80% случаев над одним объектом событие не срабатывает, у другого объекта событие срабатывает 100%. Допускаю что бачина имеет место быть для экземпляров InteractivePNG к дисплей листу которых были добавлены DisplayObjectContainer, которые в свою очередь имеют/не имеют DisplayObject/DisplayObjectContainer.

Вобщем целый день ковырял эту ситуацию, ровным счетом ничего. Помогите кто, чем может, может кто сталкивался с подобной ситуацией.

СлаваRa 21.02.2013 00:38

минимальный пример "в студию!"

Vreden 21.02.2013 00:53

Сам объект на ROLL_OVER которого редко что происходит

Код AS3:

package ***
{
        ***
 
        import flash.display.Bitmap;
        import flash.filters.DropShadowFilter;
        import flash.text.TextField;
        import flash.text.TextFieldAutoSize;
        import flash.text.TextFormat;
 
        public class SkullInfo extends InteractivePNGControl
        {
                private var __button:Button
                private var __background:Bitmap;
                private var __icon:Bitmap;
                private var __value:int = 0;
                private var __textField:TextField;
                private var __color:uint = 0x00;
                private var __tooltip:Tooltip;
 
                public function SkullInfo(controls:Controls)
                {
                        super(controls);
 
                        __refresh();
                }
 
                public function get button():Button
                {
                        if (!__button)
                        {
                                __button = new Button(controls);
                                __refresh();
                        }       
 
                        return __button;
                }
 
                public function set background(value:Bitmap):void
                {
                        if (__background && __background.parent)
                                this.removeChild(__background);       
 
                        __background = value;
                        __refresh();
                }
 
                public function get background():Bitmap
                {
                        return __background;
                }
 
                public function set icon(value:Bitmap):void
                {
                        if (__icon && __icon.parent)
                                this.removeChild(__icon);
 
                        __icon = value;
                        __refresh();
                }
 
                public function get icon():Bitmap
                {
                        return __icon;
                }
 
                public function set value(val:int):void
                {
                        __value = val;
                        __refresh();
                }
 
                public function get value():int
                {
                        return __value;
                }
 
                public function set color(value:uint):void
                {
                        __color = value;
                        __refresh();
                }
 
                public function get color():uint
                {
                        return __color;
                }
 
                public function set tooltip(value:String):void
                {
                        if (!__tooltip)
                                __tooltip = new Tooltip(controls, this);
 
                        __tooltip.text = value;
                }
 
                public function get tooltip():String
                {
                        return __tooltip.text;
                }
 
                private function __refresh():void
                {
                        if (__background)
                        {
                                __background.y = 3;
                                this.addChild(__background);
                        }       
 
                        if (__button)
                        {
                                __button.x = 65;
                                __button.y = 5;
                                this.addChild(__button);
                        }       
 
                        if (__icon)
                        {
                                __icon.x = 60;
                                this.addChild(__icon);
                        }       
 
                        if (!__textField)
                        {
                                __textField = TextFormats.defaultTextField;
                                __textField.filters = [new DropShadowFilter()];
                        }
 
                        __textField.defaultTextFormat = new TextFormat(TextFormats.EMBED_FONT, 13, __color);
                        __textField.text = value.toString();
                        __textField.autoSize = TextFieldAutoSize.LEFT;
 
                        __textField.x = 35 - __textField.width / 2;
                        __textField.y = 6;
                        this.addChild(__textField);
                }
        }
}

Базовый класс, класса выше, ничего интересного

Код AS3:

package ***
{
        ***
        import com.mosesSupposes.bitmap.InteractivePNG;
 
        public class InteractivePNGControl extends InteractivePNG implements IControl
        {
                private var __controls:Controls;
 
                public function InteractivePNGControl(controls:Controls)
                {
                        super();
 
                        __controls = controls;
                }
 
                public function get controls():Controls
                {
                        return __controls;
                }
        }
}

Класс, в котором подписывается на события экземпляр класса SkullInfo
Подпись прямо в конструкторе.

Код AS3:

package ***
{
        ***
        import com.ninemokeys.lib.BmdFactory;
 
        import flash.display.Bitmap;
        import flash.display.DisplayObject;
        import flash.display.InteractiveObject;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Rectangle;
        import flash.text.TextField;
        import flash.text.TextFieldAutoSize;
 
        public class Tooltip extends SpriteControl
        {
                private static const TOOLTIP_BACKGROUND_IMAGE:String = "images/ui/tooltipBackground.png?v=2";
 
                private var __object:InteractiveObject;
                private var __text:String;
                private var __textField:TextField;
                private var __background:Bitmap;
                private var __backgroundLoaded:Boolean = false;
                private var __container:Sprite;
 
                public function Tooltip(controls:Controls, object:InteractiveObject)
                {
                        super(controls);
 
                        __object = object;
 
                        controls.images.addEventListener(ImagesEvent.IMAGES_LOAD_COMPLETE, __imagesLoadComplete);
                        controls.images.loadImages([TOOLTIP_BACKGROUND_IMAGE]);
 
                        __object.addEventListener(MouseEvent.ROLL_OVER, __over);
                        __object.addEventListener(MouseEvent.ROLL_OUT, __out);
                }
 
                public function set text(value:String):void
                {
                        __text = value;
 
                        if (!__textField)
                        {
                                __textField = TextFormats.defaultTextField;
                                __textField.defaultTextFormat = TextFormats.tooltipFormat;
                        }
 
                        __textField.text = __text;
                        __textField.autoSize = TextFieldAutoSize.LEFT;
                }
 
                public function get text():String
                {
                        return __text;
                }
 
                private function __imagesLoadComplete(e:ImagesEvent):void
                {
                        controls.images.removeEventListener(ImagesEvent.IMAGES_LOAD_COMPLETE, __imagesLoadComplete);
 
                        __backgroundLoaded = true;
                }
 
                private function __over(e:MouseEvent):void
                {
                        if (__backgroundLoaded && __text)
                        {
                                if (!__background)
                                {
                                        var background:Bitmap = controls.images.getLoadedImage(TOOLTIP_BACKGROUND_IMAGE);
 
                                        __container = new Sprite();
 
                                        __background = new Bitmap(
                                                BmdFactory.drawSliced9(
                                                        BmdFactory.slice9(background.bitmapData, new Rectangle(4, 4, background.width - 6, background.height - 6)), __textField.width + 8, __textField.height + 8));
                                }
                        }       
                        else
                                return;
 
                        __refreshTooltipPosition();
 
                        __object.stage.addChild(__container);
                        __container.addChild(__background);
                        __textField.x = 3
                        __textField.y = 3
                        __container.addChild(__textField);
 
                        this.addEventListener(Event.ENTER_FRAME, __onEnterFrame);
                }
 
                private function __out(e:MouseEvent):void
                {
                        this.removeEventListener(Event.ENTER_FRAME, __onEnterFrame);
 
                        if (__container && __container.parent)
                                __container.parent.removeChild(__container);
                }
 
                private function __onEnterFrame(e:Event):void
                {
                        __refreshTooltipPosition();       
                }
 
                private function __refreshTooltipPosition():void
                {
                        if (__object.stage.mouseX + __container.width + 25 > __object.stage.stageWidth)
                                __container.x = __object.stage.mouseX - __container.width - 15;
                        else
                                __container.x = __object.stage.mouseX + 15;
 
                        __container.y = __object.stage.mouseY + 15
                }
        }
}

Пожалуй, это самый минимальный код одного из проблемных объектов, объекты поменьше проблем не имеют

Добавлено через 22 минуты
P.S Как только я базовый класс для проблемных объектов заменяю на Sprite, вместо InteractivePNG, все проблемы исчезают.

caseyryan 21.02.2013 10:20

В interactivepng используется приоритет слушателей 10000. Видимо действие просто отменяется, при определенных условиях. Возможно стоит подрегулировать свойство _threshold.
Хотя у меня и на дефолтных настройках такой проблемы не наблюдается

Vreden 21.02.2013 13:41

caseyryan, огромное спасибо, приоритет слушателей -1 порешал все проблемы. _threshold я уже регулировал, он не влиял на ситуацию.


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

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