Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   событие ENTER_FRAME (http://www.flasher.ru/forum/showthread.php?t=153553)

goldlider 04.04.2011 22:03

событие ENTER_FRAME
 
Доброго времени суток.
Никак не могу понять, как работает событие Event.ENTER_FRAME. Читал мануал, но это не помогло в решении проблемы. Вот код:

Код AS3:

private function playButtonClickHandler(event:MouseEvent):void
{
        playButton.removeEventListener(MouseEvent.CLICK, playButtonClickHandler);
        gotoAndStop("Intro");
        addEventListener(Event.ENTER_FRAME, everyFrame, false, 0, true);
}
 
 
private function everyFrame(event:Event):void
{
        removeEventListener(Event.ENTER_FRAME, everyFrame);
        if (storm.currentFrame == storm.totalFrames)
        {
                storm.stop();
                gotoAndStop("Game");
        }
}

Имеется 3 кадра во Flash IDE, каждый из которых имеет собственные имена. После загрузки прелоадера появляется кнопка Play, по нажатию на нею мы переходим во второй кадр Intro, который содержит мувиклип под именем storm, внутри которого анимация. Так вот мне хотелось бы, после того, как проигралась анимация в мувиклипе, перейти обратно на главную временную шкалу в третий кадр Game. А проблема заключается в том, что у меня этот мувиклип при запуске бесконечно воспроизводится. Хотя не знаю почему, но при замене removeEventListener(Event.ENTER_FRAME, everyFrame) на storm.removeEventListener(Event.ENTER_FRAME, everyFrame) , но при этом оставляя это addEventListener(Event.ENTER_FRAME, everyFrame, false, 0, true) без изменений переход осуществляется в третий кадр, но выходит в окне Otput такое сообщение "TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Preloader/everyFrame()"

Stargazer 04.04.2011 22:09

Просто внимательно прочтите ваш код. У вас ошибка в логике. Первое, что делает everyFrame - это удаляет слушатель с ENTER_FRAME независимо от того, находитесь вы на последнем кадре или нет.

goldlider 04.04.2011 22:25

Stargazer, ну вот убрал я это removeEventListener(Event.ENTER_FRAME, everyFrame), но то сообщение осталось.

etc 04.04.2011 22:35

Сделайте в начале everyFrame:
Код AS3:

trace(storm);

Если там null, значит мувиклипа с указанным именем нет на сцене в текущем кадре.

30000

dimarik 04.04.2011 22:37

AVM найти не может storm aka MovieClip. Помогите ей его найти.

goldlider 05.04.2011 09:12

etc, поставил перед everyFrame trace(storm), в output вывелось 66 раз [object MovieClip], т.е. внутри мувиклипа действительно 66 кадров. А вот после того, как мувик проигрался при переходе из внутреннего таймлайна мувиклипа в главный выходит тоже самое сообщение.

dimarik, мувиклип у меня нах-ся во 2-ом кадре. В 3-ем кадре его нету, как я и задумал.

А вообще мне не понятно, когда я пишу просто
Код AS3:

addEventListener(Event.ENTER_FRAME, everyFrame, false, 0, true)

stage слушает данное событие так ведь ?
А когда
Код AS3:

storm.addEventListener(Event.ENTER_FRAME, everyFrame, false, 0, true)

мувиклип слушает ? Так почему, если я пишу просто addEventListener у меня мувиклип запускается, хотя кадры находятся у него внутри. И разницы между этими записями не происходят. Хоть я напишу первый вариант, у меня переход в кадр с мувиклипом осуществляется, хоть я напишу второй вариант, происходит тоже самое.

MAPUTO 05.04.2011 09:23

Создай объект-пустышку к нему и примени слушатель (obj.addEventListener...), либо применяй его к объекту storm (storm.addEventListener...) и удаляй в 66-м кадре (storm.removeEventListener...).

goldlider 05.04.2011 09:33

MAPUTO, у меня в кадрах ничего не написано, все написано в отдельном as-файле, который связан с Flash IDE. Вас не поймешь, одни говорят убрать removeEventListener в ф-ии everyFrame, другие говорят поставить.
В обоих случаях ошибка возникает.

MAPUTO 05.04.2011 09:41

removeEventListener надо ставить не в самой функции а так чтобы она срабатывала после проверки события достижения последнего кадра мувика.
Код AS3:

private function everyFrame(event:Event):void
{
        if (storm.currentFrame == storm.totalFrames)
        {
                removeEventListener(Event.ENTER_FRAME, everyFrame);
                storm.stop();
                gotoAndStop("Game");
        }
}


Stargazer 05.04.2011 13:08

Вот, MAPUTO написал то, что я думал, что вы и сами поймёте. Ошибка, видимо, возникает тогда, когда вы переходите на 3-й кадр не убирая слушателя. На 3-м кадре у вас, видимо, storm-а нет (что логично, зачем держать интро на кадре, где должна быть "Game"), поэтому выражения storm.currentFrame и storm.totalFrame приводят к ошибке (неоткуда получать эти свойства, пусто).

Добавлено через 8 минут
Цитата:

Сообщение от goldlider (Сообщение 986644)
А вообще мне не понятно, когда я пишу просто
Код AS3:

addEventListener(Event.ENTER_FRAME, everyFrame, false, 0, true)

stage слушает данное событие так ведь ?
А когда
Код AS3:

storm.addEventListener(Event.ENTER_FRAME, everyFrame, false, 0, true)

мувиклип слушает ? Так почему, если я пишу просто addEventListener у меня мувиклип запускается, хотя кадры находятся у него внутри. И разницы между этими записями не происходят. Хоть я напишу первый вариант, у меня переход в кадр с мувиклипом осуществляется, хоть я напишу второй вариант, происходит тоже самое.

Непонятно, чего вы непонимаете. Вы не с as1/2 перешли? Неважно, кто слушает. Важно, что функция, которая слушает, находится в Preloader. Поэтому у неё область видимости Preloader-овская.


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

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