Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Как устроить "колцевое" воспроизведение клипов?
Flash Zone Forum > Macromedia Flash > Общие вопросы
s8000_1
Всем привет.
У меня есть несколько клипов, сохраненных в библиотеке (допустим названия 1_mc, 2_mc, 3_mc). Я хочу устроить воспросизведение этих клипов следующим образом.
1 -> 2 -> 3 -> 1
Но не вручную рисуя их на таймлинии а через Actionscript, т.к. временные размеры (длительность) этих клипов предполагаются динамическими.
Я организовал это дело следующим образом: прописал внутри каждого клипа действия так:
fr1 : stop();
this._visible=0;
fr2 : метка_1;
this._visible=1;
...
fr20: stop;
this._visible=0;
_parent.next_mc.gotoAndPlay("метка_2");

и поместил эти клипы на главной сцене.
Однако хотелось бы узнать, как это можно сделать менее "криво"? Т.к. фраза
_parent.next_mc.gotoAndPlay("метка_2");
затрагивает структуру символа, которую хотелось бы иметь одну на всех.
nikitar
Лучше всего для этих нужд использовать переменную, которая будет находиться в руте.
Например у тебя есть 3 клипа. Обзовём из в инстанс нейме b1, b2, b3
В главной сцене у тебя стоит
Код

i=1;
_root.b1.play();


Далее в каждом мувиклипе стоит в первом кадре stop();
а в последнем кадре

Код

if(_root.i<3){
_root.i++;
}
else{
_root.i=1;
}
_root["b"+i].play();


Маленькая особенность мувиклипов в каждом мувиклипе первый кадр пустой.
Ну и код соответственно повторяется и там и там. Не думаю что это так сложно. Ну если сложно можно это записать в функцию и потом уже повторять.
Если совсем не хочется ковыряться в мувиклипах. Например, у вас 200 мувиклипов. Тогда можно поступить другим путём, через totalframes();
Если надо напишу код как это делается.
MustLive
s8000_1

Подобная тема уже на форуме затрагивалась (уже не раз участники спришивали касательно создания мп3 плееров на флешере и не раз уже возникали вопросы по плейлисту и поочерёдному проировании). Так что поиск поможет.

Можешь сделать как ты сейчас сделал. А можешь держать список в отдельной переменной (массииве) и по нему проходитЬ - это если список заранее заданный, а если динамичесий - то можешь его извне загружать (через передачу переменный или из текстового или xml файла).

Суть ты уловил правильно - в конце клипа нужно сделать вызов перехода на следующий мувик. И это один из вариантов (возможны и другие - см. форум).

Но ты лишь с алгоритмом переборщил (услложнил) немного. В плане меток - можно сделать и просто _parent.next_mc.gotoAndPlay (или _root.next_mc.gotoAndPlay), а ещё лучше при любом алгоритме (с вызовами в конце клипов или с другими подходами) вызывать функцию. Например, NextClip() - в конце каждого клипа (или сделать отдельный мувик, который будет "управлением" заниматься и вызывать его, посылать тот же gotoAndPlay, но с функцией будет удобней).

А уже в функции определять текущий мувик и переходить к следующуму (и в конце переходить к первому). Можно и из мувика передавать текущее имя клипа (вызов будет: NextClip(_this.name)). И тогда будт один вызов на все клипы. Что будет тебе удобнее. Я уж не говорю, что мог внутреннюю метку одну и туже сделать во всех клипах.

А насчёт того, чтобы спрятать все клипы - то здесь тоже можно было сделать по другому, оптимальнее. Чтобы более удобно прятать и отображать мувики (через _visible).
s8000_1
nikitar, у меня вообще почему-то не хочет воспроизводиться первый клип без растягивания на нужную длину таймлинии.
Исходник:
http://ifolder.ru/670408
Проблему решил методом создания клипа "start" с действиями "_root.b1.play(); stop();"
Однако все ж, почему если просто в корне прописать "_root.b1.play()", то оно без растягивания таймлинии играть не будет?
nikitar
Я посмотрел. Такое случается. Лечится достаточно просто. В главной линейке сделай второй кадр. В первый кадр помести свой мувик, но чтобы он продолжался до второго, а во второй вставь код и поставь ещё stop();
Теперь с чем такое связано. Дело в том, что и ролик и команда ему загружаются одновременно, сдедовательно она не исполняется, так как сначала грузится код, и не найдя мувиклипа, не исполняется, потом подгружается мувиклип, но не найдя комманд ничего не делает. Это происходит в доли секунды но джля флэша существенно, поэтому советую сделать так в 2 кадра.
SanSanych
ответ на сообщение 1

Я исходил из того, что у тебя MovieClips называются mc_1, mc_2 и т.д.
Убедись, что вкючено Export for Action script и Export in first frame в свойствах клипа.
В конце каждого из них содаешь keyframe, в нем скрипт:

_root.playNextMC();

В кадре 1 сцены скрипт:

maxMC = 3; // кол-во MovieClip`ов
for (i=0; i<maxMC; i++) {
_root.attachMovie("mc_"+(i+1), "mc_"+(i+1), this.getNextHighestDepth(), {_x:0, _y:0}); // _x, _y координаты клипов при воспроизведении
eval("mc_"+(i+1))._visible = false;
eval("mc_"+(i+1)).stop();
}
i = 0;
function playNextMC() {
eval("mc_"+i)._visible = false;
eval("mc_"+i).stop();
i++;
if (i>maxMC) {
i = 1;
}
eval("mc_"+i)._visible = true;
eval("mc_"+i).gotoAndPlay(1);
}
playNextMC();

исходник на test.yarcity.com/us/2s8000_1.rar

s8000_1
Цитата(SanSanych @ 21.12.2006 - 01:27) *

Убедись, что вкючено Export for Action script и Export in first frame в свойствах клипа.

ООО! Спасибо тебе огромнейшее! За реализацию "кольцевого воспроизведения", но и за то, что ты решил одну мою проблему, которую я никак не мог решить smile.gif - почему у меня не работает attachMovie ). Оказалось из-за галочки в свойствах.
SanSanych
Рад что помог.
И еще. Для action scripts желательно создавать новый слой.
В исходнике я этого не сделал, а надо было. Ну да ладно.
s8000_1
Итак, попробовав разные варианты, сделал так:

Для каждого объекта прописал parameter типа nextmoviename, там настраивал уже имя... это по-моему более гибко, чем одной переменной и именем обзывать разные объекты.
Способ с отсутствующим первым кадром и вызовом функции nextmovie в последнем - ИМХО более совершенен, тут синхронизированно все по времени, т.к. код выполняется в начале загрузки кадра, как я понял.
Всем ещё раз thanks, проблема решена ).
MustLive
Цитата
И еще. Для action scripts желательно создавать новый слой.
В исходнике я этого не сделал, а надо было. Ну да ладно.

Так и есть, SanSanych. Так и нужно делать.

Это давняя практика, и это корректный стиль флеш разработки, когда AS код выносится в отдельный слой.

Это было во времена AS1. Во времена AS2 и тем более AS3 код принято записывать в классы, которые заносятся в отдельные .as файлы. Но в любом случае всё должно быть сделано прилично, без нагромождений.

Цитата
Для каждого объекта прописал parameter типа nextmoviename, там настраивал уже имя

s8000_1, это тоже вариант.

Но как я писал ранее, и как уже писал на форуме, что можно занести список мувиков (и других файлов для загрузки) в текстовый или xml файл, и подгружать оттуда. И уже по загруженным данным создавать список проигрывания и по нему проигрывать файлы. Тогда тебе не придётся задавать для каждого мувика параметр nextmoviename. Это было бы более удобней. Но и так тоже можно.
s8000_1
MustLive, а вообще говоря, баннеры так и делаются с пом. "кольцевого" воспроизведения (ведь там идет логическое воспроизведение элементов друг за другом)? Или обычная практика - вручную рисовать ключевые кадры на таймлинии?
nikitar
Не вижу ничего плохого в рисовании кадров на таймлайне. Главное не на главном таймлайне. То есть хорошая практика в главной сцене иметь только один мувиклип, в котором весь баннер и есть, потом если нужно будет двигать или копировать, очень поможет.
s8000_1
nikitar Ну а если баннер, допустим, состоит из 5ти одинаковых по длительности кусочков, а требуется изменить время воспроизведения всех 5ти? Тогда придется править таймлинию в 5ти местах, при этом не запутавшись...
nikitar
Во-первых такая ситуация редка, но бывает согласен. И думаю, что будет легче править в 5-ти местах, чем весь баннер делать программным.
Вообще баннер такая штука, в которой программирование должно быть минимальным. И оно приемлемо, если только написать код дело 10 минут и он реально помогает работе. Если нет, то и заморачиваться не стоит.
MustLive
Цитата
MustLive, а вообще говоря, баннеры так и делаются с пом. "кольцевого" воспроизведения (ведь там идет логическое воспроизведение элементов друг за другом)? Или обычная практика - вручную рисовать ключевые кадры на таймлинии?

s8000_1

При чём тут кольцевое воспроизведение? Как я уже многократно писал на форуме по поводу подобного воспроивзедение, то оно используется при создании плееров (мп3 и любых других) на флеше. Когда ты подгружаешь н-ное количество файлов (тех же клипов), и воспроизводишь их по порядку, зацыкленно.

А баннеры не используют каких либо кольцевых воспроизведений - они лишь делаются зацыкленными. А само содержимое баннера - его или на одной сцене в таймлайне сделай или в нескольких сценах - главное чтобы реклама была эффективная (т.к. одна из мер эффективности баннера - это CTR).

Баннер - это самостоятельная единица (и в одном баннере 5 баннеров не делаются). В случае же нескольких баннеров, то делается баннеро-крутилка (на серверном языке) и крутишь себе баннеры, любое количество. Или создаёшь глобальную крутилку (как в случае баннерных сетей) или локальную для сайта (как например моя MustLive Banner System).

И крутишь баннеры любые - и графику и флеш и текст (главное поддержку реализовать). Но баннерные системы создаются на серверных языках (perl, php и др.). Не нужно создавать баннерокрутилку на флеше - это уже изврат. И подобным не стоит увлекаться, и на флеше подобное реализовывать.

Цитата
nikitar Ну а если баннер, допустим, состоит из 5ти одинаковых по длительности кусочков, а требуется изменить время воспроизведения всех 5ти? Тогда придется править таймлинию в 5ти местах, при этом не запутавшись...

В идеале баннер не должен состоять из пяти (и тем более не должен потом ещё пять отдельных кусков подгружать). Баннер - это самостоятельная единица.

В случае когда в баннере условно есть пять отдельных "эпизодов", то для изменения их длительности (для всех сразу) можно или fps изменить (увеличить или уменьшить), или же руками добавить кадров промежуточных для каждого из "эпизодов". При этом все части могут быть как в одной сцене на таймлайне, так и в разных сценах.

Цитата
Во-первых такая ситуация редка, но бывает согласен. И думаю, что будет легче править в 5-ти местах, чем весь баннер делать программным.

Баннер по возможности вообще не должен содержать программинга - весь программный код в нём, это вызов урла сайта для перехода. И вся программная логика выносится на баннерные системы (локальные или глобальные). Или же часть может ещё быть в ява-скрипт коде (для дополнительных нужд, в том числе при rich media).

Но баннер - это прежде всего рекламный носитель. И там в большинстве случаев ограничиваются анимацией. И программинг используется минимально (или вообще не используется, лишь для getURL есть код). Так что никаких программных баннеров (и тем более движков баннерных) на флеше быть не должно (исключением являются интерактивные баннеры, но это отдельный вид, и вес файлов больше и это вообще другая история). Поэтому делайте нормальные баннеры на флеше, и с минимальными размерами (о чём я уже в другой теме сказал, что баннер не д.б. под 200-300 КБ, а максимум 20-30 КБ).
Русская версия IP.Board © 2001-2007 IPS, Inc.