Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как получить из метки фрейма его номер ? (http://www.flasher.ru/forum/showthread.php?t=70008)

Bорон 05.10.2005 18:31

Как получить из метки фрейма его номер ?
 
Доброго времени суток.
Есть Ф-я управляющая анимацией. (крутит мувики от точки до точки и обратно и т.д.)
Анимация маркирована для удобства метками (frame label).
Если в ф-ю поступает в качестве "от" и "до" параметров числа - все ок.
Если пробую использовать метки - глючит.
Подозреваю что дело в конструкции

Цитата:

x=this._currentframe+1;
if(x==this.to){
...
Так как х это число, а this.to - строка с именем метки.
Как бы их перевести корректно ?
Подскажите пожалуста.

iNils 05.10.2005 18:42

Просто меток не существует в swf :)
Они только для редактирования, как только ты создаешь swf, все метки заменяются текущими числовым значением нужных кадров.

Bорон 05.10.2005 19:23

Ы.
В чем же тогда может быть загвоздка, если при вводе чиловых значений все ОК.
А когда метки - глючит....
Привожу на всяк случай полный код ф-и:

Цитата:

function play_both(from,to,obj,leng,st,dir,tr_mod){
switch(dir){
case 1:
obj.state="front";
break;
case 2:
obj.state="back";
break;
}
obj.leng=leng;
obj.from=from;
obj.to=to;
obj.tr_mod=tr_mod;
switch(st){
case 1:
obj.gotoAndStop(from);
break;
case 2:
tmp=((to-from)/2)+from;
obj.gotoAndStop(tmp);
break;
case 3:
obj.gotoAndStop(to);
break;
}
if(obj.tr_mod==1){
trace("start frame : "+obj._currentframe)
}

obj.onEnterFrame = function (){

switch (this.state) {

case "front":
x=this._currentframe+1;
if(x==this.to){
this.state="back";

if(obj.tr_mod==1){
trace("turn back: "+this._currentframe)
}
if(this.leng!==-1){
if(this.leng>0){
this.leng-=1;
}else{
this.stop();
if(obj.tr_mod==1){
trace("stop frame on turn back: "+this._currentframe)
}
this.onEnterFrame = function () {};
}
}
}
this.gotoAndStop(x);
break;

case "back":
x=this._currentframe-1;
if(x==this.from){

if(obj.tr_mod==1){
trace("turn front: "+this._currentframe)
}
this.state="front";
if(this.leng!==-1){
if(this.leng>0){
this.leng-=1;
}else{

if(obj.tr_mod==1){
trace("stop frame on turn front: "+this._currentframe)
}
this.stop();
this.onEnterFrame = function () {};
}
}

}
this.gotoAndStop(x);
}
break;
}

}
С уважением. Ворон.

Bорон 05.10.2005 19:28

Синтаксис:
play_both( от , до ,ссылка на обьект , количество полуциклов , откуда начинать , направление , режим отладки)

Bорон 05.10.2005 19:29

В режиме отладки при использовании меток выводит только
trace("start frame : "+obj._currentframe)
А реферные фреймы проскакивает...
=(

Подскажите что то ?

iNils 05.10.2005 20:43

Я же тебе ответил :) При запуске, все метки конвертируются в номера кадров. Они ни где не храняться и сравнивать с ними бесполезно.

Bорон 06.10.2005 02:25

Конвертируются. И что из этого следует?
Почему бесполезно ? С числом (константой) ведь сравнивать можно...
Или они НЕ заменяются числом ?
Что то я совсем запутался =(
Из твоего сообщения я сделал вывод, что нет разницы между использованием метки и числа так как при сборке в swf все метки заменяются числами. Я понял неправильно ?
Если правильно то почему с ними нельзя тогда сравнивать ?
А если нельзя сравнивать, то есть ли способ в as использовать в качестве атрибта метку ?

Bорон 06.10.2005 02:36

А бллин. понял. Метки конвертируются только если они в gotoAndPlay например. А в других случаях метка - просто текст.
Я правильно понял ?
И в этом случая поставленная задача не выполнима, так ?
Тогда может кто то подскажет идею как справится с такой проблемой. Есть клип с записью разных движений. Эти движения вызываются вышеуказанной ф-ей. Если надо изменить скорость движения - меняем количество фреймов. И все ранее указанные движения "плывут". Надо все числа "переписывать". Отсюда идея с метками. Как бы выпутатся ?
Можно конечно начать пложить бесчисленные переменные с связкой фрейм-движение. но это, извините извращение. Кроме того все связки все равно тогда придется править после каждой "подстройки" скорости.
Есть какие то идеи ? Поделитесь ?

kruasan 06.10.2005 03:51

Есть такая чудо-штука - broadcastMessage("...")
Фильм с твоими анимациями может генерировать события (широковещательная рассылка). Зарегестрируй его как вещателя:
AsBroadcaster.initialize(myClip);
Клип, который будет реагировать на эти события, зарегистрируй слушателем клипа myClip:
myClip.addListener(listenerClip);
В клипе myClip, в кадре с Анимацией 1 пишешь:
this.broadcastMessage("onAnimation1");
Т.е. вместо метки фрейма ты используешь сообщение.
При попадании на этот кадр будет генериться событие onAnimation1, которое "услышит" listenerClip.
Теперь можно написать: listenerClip.onAnimation1=function(){ твои действия при попадании на кадр с сообщением "onAnimation1"}

Таким образом ты отлавливаешь попадание на кадр с нужной анимацией без проверки номера кадра.

Чем это может помочь тебе?
Можно в цикле пробежаться по всем кадрам клипа myClip и получить номера кадров всех твоих анимаций. А перед пробегом написать:
listenerClip.onAnimation1=function(){anim1Frame=myClip._currentframe}
listenerClip.onAnimation2=function(){anim2Frame=myClip._currentframe}
listenerClip.onAnimation3=function(){anim3Frame=myClip._currentframe}
и т.д.

Должно сработать ;)

kruasan 06.10.2005 04:19

А можно еще проще:

В кадре с 1-й анимашкой пишем _root.anim1Frame=this._currentframe.
В кадре с 2-й анимашкой пишем _root.anim2Frame=this._currentframe.
и т.д.
Ну и делаем то же самое:
в цикле пробегаем по всем кадрам клипа myClip и получаем номера кадров всех твоих анимаций.
Затем юзаем уже номера кадров

ultraflasher 06.10.2005 09:28

> Есть такая чудо-штука - broadcastMessage("...") ... блпблпблп

Интересно как это связано с темой вопроса ...

iNils 06.10.2005 10:41

Попытка эмуляции меток :)
Ворон ты правильно понял, что метки конвертяться в кадры только внутри методов управляющих положением мувика на таймлайн.

kruasan 06.10.2005 16:01

Цитата:

Сообщение от ultraflasher
> Есть такая чудо-штука - broadcastMessage("...") ... блпблпблп

Интересно как это связано с темой вопроса ...

2 ultraflasher
Если ты дочитал пост, то должен был понять.
Вопрос ведь не о метках как таковых, а о какой-либо маркировке кадров, с которой сможет нормально работать код.

ultraflasher 06.10.2005 16:07

Да что Вы говорите =)

Bорон 06.10.2005 18:15

2kruasan:
Идея с широковещательными сообщениями замечательная.
Покрутил ее немного и столкнулся с такой проблемой.
0. broadcastMessage - у меня Flash MX. такого ключевого слова ненашол =(
к какому из Build-in Classes оно относится ?
1. Имеет смысл делать только 2 широковещательных сообщения:
повернуть вперед и повернуть назад. А двигать так же с помощью onenterframe
2.В одном морфинге может содержатся десяток "вложеных" движений. Например в повороте на 360 градусов есть поворот на 45... И при этом когда нам нужен именно поворот на 360 градусов мы будем получать сообщения от всех вложенных движений. Как то можно их похитрому диференцировать ? Например аргументами ?

kruasan 06.10.2005 18:35

0.
Все, что связано с броадкастерами - вещи недокументированные. Даже в 7-ке их формально нет. Насчет FlashMX (6-ка) ничего сказать немогу, так как не использую. Хотя Р.Пеннер пишет, что если во FlashMX запустить такой код:
ASSetPropFlags(AsBroadcaster, null,8,1);
for(var i in AsBroadcaster) trace(i)
то на выходе будет список методов и свойств, среди которых и broadcastMessage.

1.
Тебе видней

2.
Можно.
broadcastMessage("onMessage",argument1, argument2,...,argumentN);
Тогда отлов событий делаем так:
listener_mc.onMessage=function(argument1, argument2,...,argumentN){...}

ultraflasher 06.10.2005 18:49

> Все, что связано с броадкастерами - вещи недокументированные

Ошибочка, в восьмёрке уже документированы.

kruasan 06.10.2005 19:04

Речь идет о шестерочке

ultraflasher 06.10.2005 19:23

> Речь идет о шестерочке

Это где это речь идёт о шестёрке? =)

Bорон 08.10.2005 20:39

Цитата:

В кадре с 1-й анимашкой пишем _root.anim1Frame=this._currentframe.
В кадре с 2-й анимашкой пишем _root.anim2Frame=this._currentframe.
и т.д.
=(
Доказало свою не состоятельность. Дело в том что присвоение происходит только когда мувик проигрывает этот фрейм.
Что бы это было реально нужно как минимум один праз его полностью проиграть.
Что грусно.
=(

Над громкоговорителем пока медитирую.

kruasan 08.10.2005 22:22

Я ж говорил: один раз пробегаем в цикле по кадрам мувика. НЕ проигрываем мувик, а ПРОБЕГАЕМ В ЦИКЛЕ ПО ЕГО КАДРАМ. Это произойдет мгновенно, и ты получишь номера кадров с анимациями.
for(var i=1; i<=animations_mc._totalframes; i++){ animations_mc.gotoAndStop(i) }
Проделываешь это с самого начала, а потом работаешь с номерами.

То же самое надо сделать и при использовании броадкастера.

ultraflasher 08.10.2005 22:31

Это конечно далеко не панацея ... так как все скрипты находящиеся в кадрах будут выполнятся ...

iNils 08.10.2005 22:33

Жуть. Только если все скрипты в кадрах поставить внутрь условия который проверяет включен флаг обхода или нет.

ultraflasher 08.10.2005 22:36

Тогда наверно проще вручную ввести номера меток кадров ...

iNils 08.10.2005 22:37

Я и говорю - жуть :)

iNils 08.10.2005 22:38

А в целом надо организовывать правильно и заранее клип и не использовать тогда метки, а сразу кадры.

kruasan 09.10.2005 01:29

Цитата:

Сообщение от iNils
Я и говорю - жуть :)

Согласен, что это через задницу.
Хотя все относительно... Более рационального решения я пока не вижу


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

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