AS3: MOUSE_OUT не срабатывает, когда мышь покидает сцену - PullRequest
2 голосов
/ 06 января 2010

Я разрабатываю веб-сайт с элементами навигации, которые охватывают всю стадию сверху вниз (см. Измененное изображение ниже), и пользователю довольно легко выйти из сцены с помощью мыши, не вызывая требуемых событий MouseEvent.MOUSE_OUT "отключить" указанные элементы навигации.

Должен ли я использовать Event.MOUSE_LEAVE, чтобы определить, когда мышь покинула сцену, и отключить все включенные элементы навигации? Это то, что я пытался сделать, но мне было трудно получить какой-либо вывод от моего слушателя. Есть идеи?

альтернативный текст http://marcysutton.com/blog/wp-content/uploads/2010/01/redpropeller.png

Для класса, связанного с мувиклипом в Flash IDE, это правильный синтаксис для регистрации слушателя Event.MOUSE_LEAVE? Кажется, он ничего не делает независимо от того, что я делаю. Это тот случай, когда мне нужно вставить фильм в браузер, чтобы событие сработало?

this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);

Вот мой класс MainNav.as:

package com.redpropeller {

import com.greensock.*;
import com.greensock.plugins.*;
import flash.display.*;
import flash.text.*;
import flash.events.*;

public class MainNav extends MovieClip { // MainNav is a movieclip in the IDE

    public var colors:Array;

    public function MainNav():void {
        colors = new Array(0xee3124, 0xc72a1f, 0xa62c24, 0x912923, 0x7e221c);
        TweenPlugin.activate([TintPlugin]);

        // trying to target stage through this object
        this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);

        for(var i:Number=0; i<this.numChildren; i++){
            var n = this.getChildAt(i);
            n.useHandCursor = true;
            n.buttonMode = true;

            n.addEventListener(MouseEvent.MOUSE_OVER, navBtnOn);
            n.addEventListener(MouseEvent.MOUSE_OUT, navBtnOff);
        }
    }
    public function mouseLeaveListener(e:Event):void {
        trace('mouseleave'); // nothing ever happens

    }
    private function navBtnOn(e:MouseEvent):void {
        TweenLite.to(e.currentTarget.bar_mc, 0.01, {tint:0x333333});
    }
    private function navBtnOff(e:MouseEvent):void {
        TweenLite.to(e.currentTarget.bar_mc, 0.01,
            {tint:uint(colors[this.getChildIndex(MovieClip(e.currentTarget))])});
            // changes color back to specific tint
    }
}

}

Ответы [ 2 ]

1 голос
/ 06 января 2010

Ответ: Event.MOUSE_LEAVE не запускается в IDE. Он прекрасно работает, когда фильм встроен в HTML-страницу. Спасибо за вашу помощь!

0 голосов
/ 12 января 2010

Вы пытаетесь создать прослушиватель событий для MOUSE_LEAVE в конструкторе. Возможно, что объект stage еще не существует, если MainNav не был добавлен на этап с помощью метода addChild (). Если MainNav уже находится на сцене во время разработки, все еще возможно, что этап не будет доступен немедленно. Для классов, которые наследуются от DisplayObject (MovieClip, Sprite и т. Д.), Я делаю только одно в конструкторе: настраиваю прослушиватель Event.ADDED_TO_STAGE. Этот слушатель вызывает метод init (), когда объект был добавлен в стек отображения сцены с помощью addChild () из родительского контейнера, или если объект уже находится на сцене во время разработки. Когда вызывается мой метод init (), я знаю, что свойство stage будет доступно.

В вашем конструкторе stage может еще не существовать в экземпляре, но вы должны получить ошибку времени выполнения. Тем не менее, вы используете ключевое слово this перед началом этапа. Когда вы используете 'this' в классе, который наследуется от Object (ваш класс делает это через MovieClip-> DisplayObject-> EventDispatcher-> Object), компилятор не выдаст ошибку, если свойство не существует, потому что он пытается создать это собственность как член 'этого'. Это происходит потому, что класс Object является динамическим, что означает, что новые свойства могут быть созданы в любое время без необходимости объявлять их как переменные класса в заголовке - вам просто нужно использовать ключевое слово this при использовании этого динамического свойства. Когда вы используете this.stage, если stage не существует, класс создает для вас этап свойства. Однако, это не та стадия, которую вы хотите, поэтому слушатель просто привязывается к пустому объекту, который ничего не делает. Попробуйте удалить «this» при обращении к этапу, и я уверен, что вы увидите ошибку в какой-то момент. В общем случае не рекомендуется использовать this для свойств, так как компилятор будет игнорировать ошибки типа для этого свойства.

Вы упомянули в одном комментарии выше, что MOUSE_LEAVE не работает в IDE, но я протестировал это в CS4 и он работает. Возможно, вы наблюдаете разницу в производительности проигрывателя Flash Player в IDE по сравнению с подключаемым модулем Flash Player. В некоторых случаях ваш прослушиватель событий сцены будет работать из конструктора, если SWF-файл загружается быстро и сцена доступна сразу, но это ненадежно. Переместите этот слушатель в метод init (), который вызывается после события ADDED_TO_STAGE, и не используйте ключевое слово this.

...