Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   проблема с циклом (http://www.flasher.ru/forum/showthread.php?t=157565)

XeODimaN 07.06.2011 15:57

проблема с циклом
 
Не хватает ума понять, где ошибка.
Общая суть: Есть анимация из сорока кадров. При нажатии на кнопку, анимация включается с текущего момента и идет до момента назначенного на эту кнопку. Если анимация дошла до конца (40 кадр), а нужный момент еще не достигнут (например: из 30 кадра надо перейти в 5ый), тоанимация проигрывается с 1го кадра.
Идея реализации: цикл в каждом кадре проверяет свою позицию. если позиция на последнем кадре, то происходит переход на 1ый кадр + прибавляется еще 1; если анимация достигла нужного места, то она останавливается. А уж для того, чтобы это была анимация, а не мгновенный переход, есть таймеры, которые переводит анимацию на 1 кадр вперед только через 1/30 секунды.
Только вот все это не работает и не могу понять почему!)Может есть простые пути, а я загнался?

Код AS3:

                        function onClick(e:MouseEvent):void
                        {
                        for (var i:int = 0;i<41;i++){
                        var curframe:int;
                        curframe = MovieClip(root).currentFrame;
                        if (curframe == 40){
                                MovieClip(root).gotoAndStop(1);
                                var myTimer1:Timer = new Timer(33,1);
                                myTimer1.start();
                                myTimer1.addEventListener(TimerEvent.TIMER, nextframe);
                                function nextframe(e:TimerEvent):void {
                                MovieClip(root).nextFrame();
                                }
                                }
                        if (curframe == 20){
                                stop();
                                break;
                                }
                        else{
                        var myTimer2:Timer = new Timer(2000,1);
                                myTimer2.addEventListener(TimerEvent.TIMER, nextframe2);
                                myTimer2.start();
                                function nextframe2(e:TimerEvent):void {
                                MovieClip(root).nextFrame();
                                }
                        }


КорДум 07.06.2011 16:23

Ой, ужас. А почему не enterFrame? Не было вот этого всего.

carrotoff 07.06.2011 18:34

Цитата:

Идея реализации: цикл в каждом кадре проверяет свою позицию. если позиция на последнем кадре, то происходит переход на 1ый кадр + прибавляется еще 1; если анимация достигла нужного места, то она останавливается. А уж для того, чтобы это была анимация, а не мгновенный переход, есть таймеры, которые переводит анимацию на 1 кадр вперед только через 1/30 секунды.
Только вот все это не работает и не могу понять почему!)Может есть простые пути, а я загнался?
Вам нужно успокоиться, отдышаться, посчитать про себя до десяти, и еще раз внимательно пересмотреть идею реализации и, конечно, сам код. Как подметил, КорДум, это ужас

XeODimaN 07.06.2011 20:35

Я знаю, что это ужас) А с ентерфреймом как, подскажите пожалуйста?

Добавлено через 36 минут
Всё, спасибо огромное, разобрался! помогли глубокие вздохи и энтерфрейм) Вместо всей моей дребедени получилось:
Код AS3:

function onClick(e:MouseEvent):void
                        {
                        addEventListener (Event.ENTER_FRAME, onFrameHandler);
                        function onFrameHandler(e:Event){
                        var curframe:int;
                        curframe = MovieClip(root).currentFrame;
                        MovieClip(root).play();
                        if (curframe == 40){
                                MovieClip(root).gotoAndPlay(1);
                        }
                        if (curframe == 20){
                                stop();
                        removeEventListener (Event.ENTER_FRAME, onFrameHandler);
                        }
                        }
                        }


saikspaik 07.06.2011 21:33

XeODimaN
У тебя функция в функции?
ИМХО, это лишнее, onFrameHandler лучше вынести отдельно.

XeODimaN 07.06.2011 21:55

Там несколько кнопок и для каждого клика разный фреймхендлер нужен. Или все равно их все вынести?

goodguy 07.06.2011 22:17

Цитата:

ИМХО, это лишнее, onFrameHandler лучше вынести отдельно.
Это не имхо, а так вообще делать нельзя. Вложенные функции уничтожаются сразу после выполнения родительской. Не нужно вырабатывать такую драцкую привычку.
Их обязательно надо выносить.

gloomyBrain 08.06.2011 01:14

Цитата:

Вложенные функции уничтожаются сразу после выполнения родительской
Вы не правы. Никуда они не уничтожаются. В AS3 функции - объекты, и для них действуют те же правила по сборке мусора, что и для всех остальных объектов.

goodguy 08.06.2011 08:55

Ну, собственно это я и имел в виду.
После выполнения родительской функции, вложенные становятся доступными для сборки мусора

kackbip 08.06.2011 15:56

Неее. Не уничтожится она. На нее ведь ссылка у EventDispatcher-а сохраняется. Проблема там только в том, что от нее отписаться хрен знает как. Но это не существенная утечка памяти. И, при условии, что на протяжении всего цикла жизни отписка от события не понадобится - это приемлемо.

ПС: охото сказать, что лучше не привыкать к вложенным функциям, но не могу найти причину для этого замечания.


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

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