2010-01-05 2 views
2

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

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

alt text 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 
    } 
} 

} 
+0

что это за графика? ваша служба хостинга вернулась к случайным фотографиям? – jedierikb

+0

Я чувствовал себя странно в публикации фактического дизайна до того, как сайт запустился .... заменен на лучшую графику. –

ответ

0

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

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

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

1

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

+0

Какую версию Flash вы используете.Я тестировал как CS3, так и CS4, и он отлично работает для меня в среде IDE. – sberry

+0

Flash CS3 ... но даже в голой swf и в простом классе Document я не получил выход. Но как только я загрузил свой файл в Интернет, мои события MouseEvent.MOUSE_OUT вызвали штраф, устраняя необходимость в Event.MOUSE_LEAVE. –

+0

Я могу проверить, что это тоже не работает для меня в среде IDE. Я использую CS4 10.0.2 для OS X 10.6.3 –

Смежные вопросы