Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.06.2011, 15:57
XeODimaN вне форума Посмотреть профиль Отправить личное сообщение для XeODimaN Найти все сообщения от XeODimaN
  № 1  
Ответить с цитированием
XeODimaN

Регистрация: Apr 2011
Сообщений: 16
По умолчанию проблема с циклом

Не хватает ума понять, где ошибка.
Общая суть: Есть анимация из сорока кадров. При нажатии на кнопку, анимация включается с текущего момента и идет до момента назначенного на эту кнопку. Если анимация дошла до конца (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
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Ой, ужас. А почему не enterFrame? Не было вот этого всего.
__________________
тут я

Старый 07.06.2011, 18:34
carrotoff вне форума Посмотреть профиль Отправить личное сообщение для carrotoff Найти все сообщения от carrotoff
  № 3  
Ответить с цитированием
carrotoff
 
Аватар для carrotoff

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

Старый 07.06.2011, 20:35
XeODimaN вне форума Посмотреть профиль Отправить личное сообщение для XeODimaN Найти все сообщения от XeODimaN
  № 4  
Ответить с цитированием
XeODimaN

Регистрация: Apr 2011
Сообщений: 16
Я знаю, что это ужас) А с ентерфреймом как, подскажите пожалуйста?

Добавлено через 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);
			}
			}
			}

Старый 07.06.2011, 21:33
saikspaik вне форума Посмотреть профиль Отправить личное сообщение для saikspaik Найти все сообщения от saikspaik
  № 5  
Ответить с цитированием
saikspaik

Регистрация: Nov 2009
Сообщений: 300
XeODimaN
У тебя функция в функции?
ИМХО, это лишнее, onFrameHandler лучше вынести отдельно.

Старый 07.06.2011, 21:55
XeODimaN вне форума Посмотреть профиль Отправить личное сообщение для XeODimaN Найти все сообщения от XeODimaN
  № 6  
Ответить с цитированием
XeODimaN

Регистрация: Apr 2011
Сообщений: 16
Там несколько кнопок и для каждого клика разный фреймхендлер нужен. Или все равно их все вынести?

Старый 07.06.2011, 22:17
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 7  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
ИМХО, это лишнее, onFrameHandler лучше вынести отдельно.
Это не имхо, а так вообще делать нельзя. Вложенные функции уничтожаются сразу после выполнения родительской. Не нужно вырабатывать такую драцкую привычку.
Их обязательно надо выносить.

Старый 08.06.2011, 01:14
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 8  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
Вложенные функции уничтожаются сразу после выполнения родительской
Вы не правы. Никуда они не уничтожаются. В AS3 функции - объекты, и для них действуют те же правила по сборке мусора, что и для всех остальных объектов.
__________________
...вселенская грусть

Старый 08.06.2011, 08:55
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 9  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Ну, собственно это я и имел в виду.
После выполнения родительской функции, вложенные становятся доступными для сборки мусора

Старый 08.06.2011, 15:56
kackbip вне форума Посмотреть профиль Отправить личное сообщение для kackbip Найти все сообщения от kackbip
  № 10  
Ответить с цитированием
kackbip
 
Аватар для kackbip

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
Неее. Не уничтожится она. На нее ведь ссылка у EventDispatcher-а сохраняется. Проблема там только в том, что от нее отписаться хрен знает как. Но это не существенная утечка памяти. И, при условии, что на протяжении всего цикла жизни отписка от события не понадобится - это приемлемо.

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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