Форум 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=86515)

Kinsler 17.10.2006 11:52

Алгоритм смены свойств для нескольких мувиклипов
 
ну собственно заголовок и есть вопрос.
Я вот что-то сообразить не могу...
Подробнее - есть несколько текстовых полей в которых должен меняться текст - таким образом появляется одни текст, с alpha=0 до 100 и обратно уходит в альфу
с некоторого момента его появления например alpha=30 начинает в другом текстовом поле появляться другой текст
ну и т.д. т.е. единорвременно должно быть несколько текстов на сцене
сам текст береться из массива
поля не могу создавать программно если что... т.е. могу но думаю что скорее всего не стоит...

etc 17.10.2006 14:28

Ну если не можешь программно, делай ручками…
Я не понимаю твоего вопроса.

Kinsler 17.10.2006 14:45

ручками плохо, потому что их много...
ну смотри есть положим 10 текстовых полей с именами tf1 ... tf10
положим в onEnterFrame
я запускаю смену альфы для первого как я описал от 0 до 100%
мне нужно через некоторое время запустить у второго, затем третьего
я не врубаюсь как всем сразу запустить такое
т.е. понятно что можно написать к примеру
i++;
tf1._alpha = i;
.
.
.
tfN._alpha = i - 100;

но это как то тупо и некрасиво....

etc 17.10.2006 15:00

Циклом побегать? Поставить проверку на _alpha?
В чём проблема-то? for .. in на худой конец.

Kinsler 18.10.2006 12:08

решил вчера таки
тоже правда через ж...у
хитрую функцию с зависимостью от номера мувика написал, имеетца в виду математическую

Kikasso 19.10.2006 06:18

Цитата:

я запускаю смену альфы для первого как я описал от 0 до 100%
мне нужно через некоторое время запустить у второго, затем третьего
я не врубаюсь как всем сразу запустить такое
Вариант 1: "каждый знает соседа"

добаляеш свойство, cсылающееся на следующего в цепочке.
Говоришь "первый.прячься();" В функции прячься() стоит проверка на какоето условие. Например так:
если(пора)this.сосед.прячься();
"сосед" в данном случае - ссылка на объект.

Вариант 2 похож, назовем его "каждый знает имя соседа".
Каждое экземпляр прописан в доме. "сосед" в данном случае - строка. Код примерно такой:
если (пора) дом-где-мы-прописаны[this.сосед].прячься();

Вариант 3 "у каждого по-разному работают часы". Выставляем каждому временной сдвиг и сажаем всем одновременно разный timeOut на вызов этого "прячься"

wvxvw 19.10.2006 07:25

я кажется понял, что же нужно сделать...
как по мне - саое простое решение - запускать 1 онентерфрейм и в switch'e проверять что же именно нужно сделать. Примерно так:
Код:

var toDo:Number=0;
_root.onEnterFrame = function(){
switch(toDo){
case 1:
myFunction1();
break;
case 2:
myFunction2();
break;
case 3:
myFunction3();
break;
}
}

Каждая функция может изменить значение переменной toDo на какое-нибудь другое, так, что после ее выволнения будет запущена следующая.
Либо значение toDo можно менять в онЭнтерФрейме - тогда последовательно заполняя варианты switch'a получится своего рода сценарий типа: сейчас играем кадр №1, значит нужно запустить функцию №1, дошли до кадра №21 - запускаем следующую функцию, и так на сколько фантазии хватит =)
Еще вариант - сложить все функции в один массив и вызывать их по номеру. Т.е. любая возможная коллизия сопровождается сменой текущего индекса массива, откуда и нужно взять функцию.
Но, вообще-то было бы лучше видеть пример, для чего это нужно. А вдруг там всего 2-3 функции и можно все сделать простыми if(){}else{}...

Kikasso 19.10.2006 08:52

Можно и так, только неизящно. Энтерфрейм тут тож вроде не причем. Лучше код на мувик вешать, примерно так:
Код:

//где-то на таймлайне
fuction fadeOut(){
  clearInterval(this.fadeOutInterval);
 if(this._alpha > 0){
  this._alpha -= 2;
  this.fadeOutInterval = setInterval(fadeOut, 20);
 }else{
  this._visible = false;
 }
 if(this._alpha >30 && this._alpha<= 32){
  //пора дергать соседа
  this.brother.fadeOut();
}
}
attachMovie("clip1", "clip1", 1, {textId:0, fadeOut:fadeOut });
attachMovie("clip2", "clip2", 2, {textId:0, fadeOut:fadeOut });
attachMovie("clip3", "clip3", 3, {textId:0, fadeOut:fadeOut });
clip1.brother = clip2;
clip2.brother = clip3;
clip3.brother = clip1;
//в нужный момент:
clip1.fadeOut();

Имеется в виду, что в руте массив textArray с текстами, у каждого мувика свой textId - ключ этого массива, чтоб текс подгрузить в нужный момент, и у каждого мувика есть brother - ссылка на другой мувик. Код может варьироваться в зависимости от версии AS, но идея понятна.
Точно так же пишется fadeIn(). Все должно работать.
Цитата:

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

motor4ik 19.10.2006 10:27

а если их много? лучше братьев именовать по очереди да и все..1.2.3.4 итд
просто поставить условие если последний то запускать первый вот и все, а так прибавлять единицу ))

Kikasso 19.10.2006 19:01

2 motor4ik: Все прекрасно будет работать, пока нам не потребуется изменить порядок.
Допустим, у нас открыт 5-й клип. Приложение интерактивно. Юзер кликнул мышкой на кнопке, и его интересует 10-й клип. Я преспокойненько назначаю 5-му следующего
clip5.brother = clip10;
и запускаю тот же код, а что ты сделаешь?:eek:
P.S. немножко неправильно, как я могу знать что открыт именно 5-й? Значит надо чтобы клип открывшись говорил такую фразу
_root.activatedClip = this;
тогда код на кнопке:
_root.activatedClip.brother = clip10;
_root.activatedClip.fadeOut();
P.P.S. activatedClip лучше чтобы был строкой, тогда за ним можно будет нормально watch`ить и автоматически запускать смену клипа.


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

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