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

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

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

Регистрация: Mar 2010
Адрес: Russian Federation
Сообщений: 59
По умолчанию Грамотный вызов stop() у мувиклипа

Приветствую, уважаемые коллеги!
Есть дилемма, которая меня давно мучает: я не знаю, как грамотно вызывать stop() у мувиклипа с областью видимости функции.

Есть три часто встречающихся способа, но все они мне не подходят.
1. Вызывать stop() в непосредственно в нужном кадре, но вызов функций в кадре - это нехорошо.
2. Использовать addFrameScript() где callback является анонимной функцией, в которой будет вызван stop() у мувиклипа, но анонимные функции - это тоже нехорошо.
3. Использовать addFrameScript() где callback является глобальной функцией, но в таком случае придется и мувиклип делать глобальным, а это опять же нежелательно.

Может можно как-то в callback передать параметр с мувиклипом? Или может существуют какие-нибудь другие, более грамонтные способы?


Последний раз редактировалось gait; 07.02.2012 в 03:32.
Старый 07.02.2012, 03:42
NikolyA вне форума Посмотреть профиль Отправить личное сообщение для NikolyA Найти все сообщения от NikolyA
  № 2  
Ответить с цитированием
NikolyA
 
Аватар для NikolyA

Регистрация: Dec 2006
Сообщений: 1,764
ээ, а сделать функцию, которая говорит мувику stop - уже не актуально? создал ее и оперируй с ней
__________________
а за окном атлантический океан!

Старый 07.02.2012, 03:46
gait вне форума Посмотреть профиль Отправить личное сообщение для gait Найти все сообщения от gait
  № 3  
Ответить с цитированием
gait

Регистрация: Mar 2010
Адрес: Russian Federation
Сообщений: 59
А как она ему это говорит? Посредством того, что она анонимная, или посредством того, что мувиклипу придется делать глобальную область видимости. Оба эти варианта меня не устраивают. Повторюсь, у мувиклипа область видимости функции.
Еще пришел в голову вариант создавать для каждого мувиклипа отдельные классы, в которых и будет stop() вызываться напрямую, но это тоже извращение какое-то. Если мувиклипов будет сотни?


Последний раз редактировалось gait; 07.02.2012 в 03:48.
Старый 07.02.2012, 03:49
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 4  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Совсем непонятен вопрос. Ну есть на сцене мувиклип , ну обратились вы к нему из класса как mc.stop() тогда когда это надо. в чем проблема то? Что значит область видимости функции? - откуда такие понятия *?
__________________
Марк Tween

Старый 07.02.2012, 03:59
gait вне форума Посмотреть профиль Отправить личное сообщение для gait Найти все сообщения от gait
  № 5  
Ответить с цитированием
gait

Регистрация: Mar 2010
Адрес: Russian Federation
Сообщений: 59
Цитата:
Сообщение от in4core Посмотреть сообщение
Что значит область видимости функции? - откуда такие понятия *?
Такие понятия у Мука я вычитал, но может что-то неправильно понял и это называтся по-другому (просто локальная область видимости, например).

Вот что имелось ввиду под вторым вариантом (локальная переменная и вызов анонимной функции, останавлювающей мувиклип):
Код AS1/AS2:
private function foo():void 
{
	var mc:check_mc = new check_mc(); //у объекта mc локальная область видимости
	mc.addFrameScript(mc.totalFrames - 1, function ():void { mc.stop(); } ); //анонимная функция останавливает мувиклип
	addChild(mc);
}
Третий вариант (делаем мувиклип глобальным с глобальной callback функцией, но делать мувиклипу глобальную область видимости нежелательно):

Код AS1/AS2:
private var mc:check_mc;
private function foo():void 
{
	mc = new check_mc();
	mc.addFrameScript(mc.totalFrames - 1, onFinalFrame);
	addChild(mc);
}
 
private function onFinalFrame():void
{
	mc.stop();
}


Последний раз редактировалось gait; 07.02.2012 в 04:08.
Старый 07.02.2012, 04:11
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 6  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
последний вариант - верный вариант, так и надо писать. и это не глобальная область. а область ( поле ) класса. глобальная это когда во всех классах. не путайте. а локальными переменными пользоваться только в случаях реальной необходимости, например как в цикле
__________________
Марк Tween

Старый 07.02.2012, 04:18
gait вне форума Посмотреть профиль Отправить личное сообщение для gait Найти все сообщения от gait
  № 7  
Ответить с цитированием
gait

Регистрация: Mar 2010
Адрес: Russian Federation
Сообщений: 59
Цитата:
Сообщение от in4core Посмотреть сообщение
и это не глобальная область. а область ( поле ) класса. глобальная это когда во всех классах. не путайте.
Ой! Извиняюсь, совсем затупил под вечер

Цитата:
Сообщение от in4core Посмотреть сообщение
а локальными переменными пользоваться только в случаях реальной необходимости, например как в цикле
Прошу прощения за флейм в своей же теме, но чем так плохи локальные переменные?

Цитата:
Сообщение от in4core Посмотреть сообщение
последний вариант - верный вариант, так и надо писать.
А если у меня этих мувиклипов несколько десятков и у каждого должен быть с десяток вызовов stop() в разных кадрах? Все мувиклипы выносить в поле класса и для каждого создавать отдельную функцию, вызывающую stop()?


Последний раз редактировалось gait; 07.02.2012 в 04:36.
Старый 07.02.2012, 10:22
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 8  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Цитата:
Сообщение от gait Посмотреть сообщение
1. Вызывать stop() в непосредственно в нужном кадре, но вызов функций в кадре - это нехорошо.
Откуда такая информация? Аргументируйте - мне самому интересно. А то, если клип из SWC должен проделывать какую-то анимацию я всегда пишу в кадре "stop()", "gotoAndStop()" etc.
Короче такие маленькие методы я всегда пишу на кадре, зачем засорять класс какими-то ненужными функциями, ентерфреймами и проверками, ради того чтобы остановить какой-то незначительный мувиклип, который и так должен должен остановится после проигрывания анимаии. Короче вот это:
Код AS3:
private var mc:check_mc;
private function foo():void 
{
	mc = new check_mc();
	mc.addFrameScript(mc.totalFrames - 1, onFinalFrame);
	addChild(mc);
}
 
private function onFinalFrame():void
{
	mc.stop();
}
сравнивать с вот этим:
Код AS3:
this.stop();
Ничего не скажу, просто со стороны посмотрите.
Цитата:
3. Использовать addFrameScript() где callback является глобальной функцией, но в таком случае придется и мувиклип делать глобальным, а это опять же нежелательно.
Как in4core уже сказал - он не будет глобальным в таком случае а переменной или свойством класса. Опять же откуда такая информация, что это нежелательно? Пруф пожалуйста.
Цитата:
Сообщение от in4core Посмотреть сообщение
Что значит область видимости функции? - откуда такие понятия *?
Это то же самое что локальная переменная - видна только в пределах одной функции.
Цитата:
Сообщение от in4core Посмотреть сообщение
а локальными переменными пользоваться только в случаях реальной необходимости, например как в цикле
А че так? Наоборот же - она удалится GC после выполнения функции и не будет мозолить глаза...

Добавлено через 1 час 8 минут
PS: не поймите меня неправильно. Я не сторонник кода в кадрах. Просто, если есть возможность написать одну строчку в кадре, вместо 15 в классе, то допускаю что эту строчку можно повесить на кадр. Почему допускаю? - потому что это надо делать не все время и когда угодно. Это надо делать с умом. То есть делать лишь в тех случаях, когда код кадра никак не влияет на происходящее вне его пределах. Пример: есть анимация крутящейся звездочки (один оборот/10 кадров). Пишем в классе код - добавляем звезду в дисплей лист. Зачем писать какие-то addFrameScript или ентерфреймовские проверки "не проигралась ли анимация до конца", чтобы вернуть ее на первый кадр и снова проиграть? Лучше написать в кадре gotoAndPlay(1) - и звезда будет крутится вечно. А когда буду писать код в классе - мне не надо парится крутится там звезда или нет - я забываю про ее анимацию и манипулирую ею как простым спрайтом. Кто сказал что такой подход плохой?
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 07.02.2012, 17:37
gait вне форума Посмотреть профиль Отправить личное сообщение для gait Найти все сообщения от gait
  № 9  
Ответить с цитированием
gait

Регистрация: Mar 2010
Адрес: Russian Federation
Сообщений: 59
О! Что-то я усложнил всё, может проще всего вот так?))

Код AS1/AS2:
mc.addFrameScript(mc.totalFrames - 1, mc.stop);
Он тоже в одну строчку

Цитата:
Сообщение от HardCoder
Я не сторонник кода в кадрах. Просто, если есть возможность написать одну строчку в кадре, вместо 15 в классе, то допускаю что эту строчку можно повесить на кадр.
Да просто, чтобы отделить мух от котлет. Может это звучит слишком категорично, но раз пишут, что кода не должно быть в кадрах, значит не должно (даже такой мелочи как stop()). Код должен быть в классах, а в графике должна быть графика, так сказать, принцип наименьшего удивления. Я вот уже как-то порвал себе волосы и потерял пару тысяч нервных клеток, пытаясь докопаться до бажины, забыв про stop() в глубоко вложенном мувиклипе и больше не хочу из-за таких мелочей терять время.


Последний раз редактировалось gait; 07.02.2012 в 18:19.
Старый 07.02.2012, 22:03
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 10  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Цитата:
Сообщение от gait Посмотреть сообщение
Я вот уже как-то порвал себе волосы и потерял пару тысяч нервных клеток, пытаясь докопаться до бажины, забыв про stop() в глубоко вложенном мувиклипе и больше не хочу из-за таких мелочей терять время.
Повторюсь:
Цитата:
Сообщение от HardCoder Посмотреть сообщение
Это надо делать с умом. То есть делать лишь в тех случаях, когда код кадра никак не влияет на происходящее вне его пределах.
__________________
Я мало чего умею, но зато хорошо умею учиться...

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

Теги
addFrameScript

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

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


 


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


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