Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Почему не срабатывает ROLL_OUT? (http://www.flasher.ru/forum/showthread.php?t=149595)

zuxul 28.01.2011 12:21

Почему не срабатывает ROLL_OUT?
 
Почему не срабатывает ROLL_OUT c контейнера "с2", когда я в обработчике клика переношу его ребенка на слой выше?
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Point;
 
        public class Main extends Sprite
        {
                public function Main() {
                        if (stage) addedToStageListener();
                        else addEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
                }
 
                private function addedToStageListener(event:Event = null):void {
 
                        var c1:Sprite = new Sprite();
                        addChild(c1);
                        c1.graphics.beginFill(0);
                        c1.graphics.drawRect(0, 0, 60, 60);
                        c1.graphics.endFill();
                        c1.name = 'c1';
                        c1.y = c1.x = 100;
 
                        var c2:Sprite = new Sprite();
                        c2.addEventListener(MouseEvent.CLICK, clickListener);
                        c2.name = 'c2';
                        c1.addChild(c2);
 
                        c1.addEventListener(MouseEvent.ROLL_OVER, rollListener);
                        c2.addEventListener(MouseEvent.ROLL_OVER, rollListener);
                        c1.addEventListener(MouseEvent.ROLL_OUT, rollListener);
                        c2.addEventListener(MouseEvent.ROLL_OUT, rollListener);
 
                        var ch1:Sprite = new Sprite();
                        ch1.graphics.beginFill(0x00FF00);
                        ch1.graphics.drawRect(10, 10, 40, 40);
                        ch1.graphics.endFill();
                        ch1.name = 'ch1';
 
                        var ch2:Sprite = new Sprite();
                        ch2.graphics.beginFill(0xFF8000);
                        ch2.graphics.drawRect(20, 20, 20, 20);
                        ch2.graphics.endFill();
                        ch2.name = 'ch2';
 
                        c2.addChild(ch1);
                        c2.addChild(ch2);
                }
 
                private function clickListener(event:Event):void {
                        var obj:Sprite = event.target as Sprite;
                        var p:Point = obj.localToGlobal(new Point(0, 0));
                        stage.addChild(obj);
                        obj.mouseEnabled = false;
                        obj.x = p.x;
                        obj.y = p.y;
                }
 
                private function rollListener(event:MouseEvent):void {
                        trace(event.type + ':' + event.target.name);
                }
 
        }
}


_sestra_ 28.01.2011 13:46

Это полное неуважение, выкладывать код с названиями переменных c1,c2,ch1,ch2.
Уберите все лишнее из кода, что бы продемонстрировать ту же самую проблему и назовите объекты информативно.

zuxul 28.01.2011 14:12

:), улыбнула...
Это минимальный код для повторения "ошибки" (ошибка в кавычках, т.к. это может быть не ошибка, а просто не понимание, того, как должно работать правильно).

Для повторения, нужно навести мышь на квадратики, на оранжевый или на зеленый, нажать на правую кнопку мыши, и посмотреть на вывод трейсов.

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Point;
 
        public class Main extends Sprite
        {
                public function Main() {
                        if (stage) addedToStageListener();
                        else addEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
                }
 
                private function addedToStageListener(event:Event = null):void {
 
                        var main_container:Sprite = new Sprite();
                        addChild(main_container);
                        main_container.graphics.beginFill(0);
                        main_container.graphics.drawRect(0, 0, 60, 60);
                        main_container.graphics.endFill();
                        main_container.name = 'main_container';
                        main_container.y = main_container.x = 100;
 
                        var internal_container:Sprite = new Sprite();
                        internal_container.addEventListener(MouseEvent.CLICK, clickListener);
                        internal_container.name = 'internal_container';
                        main_container.addChild(internal_container);
 
                        main_container.addEventListener(MouseEvent.ROLL_OVER, rollListener);
                        internal_container.addEventListener(MouseEvent.ROLL_OVER, rollListener);
                        main_container.addEventListener(MouseEvent.ROLL_OUT, rollListener);
                        internal_container.addEventListener(MouseEvent.ROLL_OUT, rollListener);
 
                        var child_one:Sprite = new Sprite();
                        child_one.graphics.beginFill(0x00FF00);
                        child_one.graphics.drawRect(10, 10, 40, 40);
                        child_one.graphics.endFill();
                        child_one.name = 'child_one';
 
                        var child_two:Sprite = new Sprite();
                        child_two.graphics.beginFill(0xFF8000);
                        child_two.graphics.drawRect(20, 20, 20, 20);
                        child_two.graphics.endFill();
                        child_two.name = 'child_two';
 
                        internal_container.addChild(child_one);
                        internal_container.addChild(child_two);
                }
 
                private function clickListener(event:Event):void {
                        var obj:Sprite = event.target as Sprite;
                        var p:Point = obj.localToGlobal(new Point(0, 0));
                        stage.addChild(obj);
                        obj.mouseEnabled = false;
                        obj.x = p.x;
                        obj.y = p.y;
                }
 
                private function rollListener(event:MouseEvent):void {
                        trace(event.type + ':' + event.target.name);
                }
 
        }
}


ChuwY 28.01.2011 14:52

Обьясни пожалуйста подробнее, что ты хочешь увидеть.
И зачем так сложно передобавляешь ребенка?
Там все эти точки не нужны.
Координаты и так сохраняются.

zuxul 28.01.2011 15:13

Координаты не сохраняются, хотя это не влияет.
Я хочу увидеть событие ROLL_OUT: допустим, для примера, я навел мышкой на оранжевый квадратик, у меня произошло событие ROLL_OVER, дальше я в "клике" удалил ребенка, и мне снова приходит событие ROLL_OVER, хотя, я подозревал (думал), что сначала должно произойти событие ROLL_OUT, а уже потом ROLL_OVER (хотя на самом деле, тут вообще никаких событий приходить не должно, мышь осталась над тем же объектом.

Xero201 28.01.2011 15:19

ты отключил событие мыши для объекта (obj.mouseEnabled = false;), поэтому его перехватил нижележащий объект (internal_container). Чтобы вообще никаких событий не происходило, объект должен сохранить способность реагировать на мышь. И еще, прежде чем добавить объект в другую область видимости, нужно удалить из предыдущей
Код AS3:

obj.parent.removeChild(obj);

Но вот почему не вылазит ROLL_OUT - фиг знает)

zuxul 28.01.2011 15:52

Цитата:

Сообщение от Xero201 (Сообщение 968548)
ты отключил событие мыши для объекта (obj.mouseEnabled = false;), поэтому его перехватил нижележащий объект

Вообще то, я так и хотел - чтобы удаляемый ребенок не ловил мышинных событий.

Цитата:

Сообщение от Xero201 (Сообщение 968548)
И еще, прежде чем добавить объект в другую область видимости, нужно удалить из предыдущей

Необязательно, в хелпе об этом сказано.

Xero201 28.01.2011 19:37

zuxul, моих сил хватает только чтобы предложить тебе какой-нибудь костыль, вроде:

Код AS3:

private function clickListener(event:Event):void {
//......
var internal_container = obj.parent as Sprite;
//......
obj.x = p.x;
obj.y = p.y;
if (obj.hitTestPoint(stage.mouseX, stage.mouseY)) {                               
        internal_container.dispatchEvent(new MouseEvent(MouseEvent.ROLL_OUT));
}

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

tsarapkabel 28.01.2011 23:23

Подпишись на mouseOut различия между rollOver/rollOut и mouseOver/mouseOut.

Xero201 29.01.2011 11:48

mouseOut проблемы не решит, его я первым делом проверил.
а если отключить mouseChildren, то как же тогда определять, по какому ребенку щелкнули (чтобы переместить)?


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

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