Форум 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 и получаем номера кадров всех твоих анимаций.
Затем юзаем уже номера кадров


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

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