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

altyr 10.08.2007 15:14

Управление воспроизведением ролика
 
Здравствуйте!

Я хочу сделать флешку, которая бы управляла воспроизведением основного ролика: запуск, останов, зацикливание. В связи с этим возникают вопросы: start и stop управляют только анимацией сцены, а не вложенных клипов - соответственно надо рекурсивно перебрать все клипы и их остановить или запустить. Но как узнать, клип в настоящий момент проигрывается или остановлен?

И ещё - есть ли какое-то свойство у клипа, которое указывает, будет ли он проигрываться один раз или по кругу?

Спасибо!!!

7DimaN7 10.08.2007 16:40

Если я тебя правильно понял, то вот.
Создаешь три кнопки.Одной пишешь:
Код:

on(press){
MyMovieClip.play();
}

Это будет кнопка проигрывания.
Вторая кнопка остановки:
Код:

on(press){
MyMovieClip.stop();
}

Третья кнопка.Просмотр заново:
Код:

on(press){
MyMovieClip.gotoAndStop(1);
}


CrazyFlasher 10.08.2007 16:44

inils давал недавно этот код, за что ему большое спасибо!
Код:

mc1.onEnterFrame = function () {
        //trace ("K")
};
_global.control = new Object ();
AsBroadcaster.initialize (control);
MovieClip.prototype.doInit = function () {
//        trace ("init")
        control.addListener (this);
        delete this.onEnterFrame;
};
MovieClip.prototype.onEnterFrame = function () {
        this.doInit ();
};

mc.onRelease = function () {
        if (!mc.check) {
                trace (control._listeners.length)
                control.broadcastMessage ("stop");
        } else {
                control.broadcastMessage ("play");
        }
        mc.check = !mc.check;
};


altyr 12.08.2007 23:24

Спасибо большое за советы, но у меня вопрос в том, что stop(), насколько я понимаю, действует только на главную сцену, а не на вложенные клипы. Поэтому если сделать stop() сцене, то вложенные клипы будут продолжать играть, пока им не сделать stop() явно. Орган управления хотелось бы сделать универсальным - для этого надо, я так понимаю, перебрать все клипы суцены и те что играют в настоящий момент запомнить и сделать им stop() (ну, соответственно, проделать это всё рекурсивно) - потом запомненным клипам сделать play(). Перебрать клипы я там понимаю не проблема - я не знаю, как проверить, играют ли они в настоящий момент или остановлены.

Ещё я не знаю насчёт управления зацикливанием, может подскажете...

Wolsh 13.08.2007 01:16

Вы не поняли. Код выше (от магистра iNils'a) при нажатии на клип mc останавливает или запускает (в зависимости от своей же последней команды) ВСЕ клипы, и _рут, и вложенные.
Я немного переписал здесь, чтобы Вам было легче протестировать - создайте три-четыре клипа с простенькой анимацией (это могут быть экземпляры одного символа), поставте их на сцену и дайте имена какие хотите, но один назовите mc - это будет управляющая кнопка. При нажатии на нее клипы будут останавливаться - запускаться. Этот код поместите в первый кадр рута. В трейсе Вы увидите имена клипов, попавших под управление. И рут тоже будет там.
Код:

_root._name = 'Root'
_global.control = new Object ();
AsBroadcaster.initialize (control);
MovieClip.prototype.doInit = function () {
        trace ("init  "+this._name);
        control.addListener (this);
        delete this.onEnterFrame;
};
MovieClip.prototype.onEnterFrame = function () {
        this.doInit ();
};

mc.onRelease = function () {
        if (!mc.check) {
                trace (control._listeners.length)
                control.broadcastMessage ("stop");
        } else {
                control.broadcastMessage ("play");
        }
        mc.check = !mc.check;
};


altyr 19.08.2007 19:44

Спасибо за код попробовал, всё работает.

Проблема в том, что запуск / останов производится ВСЕХ вложенных клипов, а не только тех, которые проигрывались в момент нажатия кнопки.

Поясню на примере:
В первый кадр помещается клип, там же ему делается stop(). В 100 кадре этому клипу делается play(). В промежутке между 1 и 100 кадрами (например, в 50 кадре) пользователь нажимает заветную кнопку 2 раза - соответственно клип, который должен был запуститься только в 100 кадре, запускается много раньше. А это не есть хорошо.

Вопрос: как отследить у объекта movieclip, играет ли он или остановлен?

Если это возможно - значит при первом нажатии кнопки надо перед остановкой запоминать все играющие клипы, чтобы при повторном нажатии запустить только их.

Спасибо за помощь

iNils 19.08.2007 22:52

Запомнить текущий кадр для каждого клипа, подождать еще один кадр и сравнить с тем, что запомнили.

Wolsh 20.08.2007 00:16

Если задержка на пару кадров Вас не пугает, можно спросить два раза currentframe и сравнить. Вот рабочий код
Код:

var ListArray:Array
_global.control = new Object ();
AsBroadcaster.initialize (control);
_global.listing = new Object ();
AsBroadcaster.initialize (listing);
MovieClip.prototype.doInit = function () {
        listing.addListener(this);
        delete this.onEnterFrame
};
MovieClip.prototype.onEnterFrame = function () {
        this.doInit ();
};
mc.check = 0
mc.onRelease = function () {
        if (!mc.check) {
                FindPlayed();
                } else {
                control.broadcastMessage ("play");
                }
        mc.check = !mc.check;
};////////////////////////////////////////////////////////////////////////////////////
function FindPlayed(){
        rec = true;
        mc.onEnterFrame = function(){
        if(!rec){
                for(v=0; v<ListArray.length; v++){
                        if(ListArray[v].cf != ListArray[v]._currentframe){// этот ролик играет!
                                control.addListener (ListArray[v]);
                        }
                }//trace('Записалось клипов: '+control._listeners.length);
                delete this.onEnterFrame
                control.broadcastMessage ("stop");
                };
        if(rec){ //trace('Всего клипов: '+listing._listeners.length);
                ListArray = listing._listeners;
                for(z=0; z<ListArray.length; z++){
                        ListArray[z].cf = ListArray[z]._currentframe;
                };
                rec = false//запись сделана
                };
        };// end onEnterFrame
       
} // end Find Played

---------------
2 iNils : впереди на лихом коне :) Классно, я много узнал нового, возясь с твоим кодом. Только знаешь, delete this.onEnterFrame из прототипа похоже не работает :(

udaaff 20.08.2007 00:53

Цитата:

Только знаешь, delete this.onEnterFrame из прототипа похоже не работает
В прототипе ничего не работает. Функция записанная в прототип наследуется экземпляром класса.

Wolsh 20.08.2007 01:28

блин опять началось... хоть вообще рот не открывай.
У меня на фирме я один дизайнер. И пять программистов (питон, С++ и т.д.)
Все нормально понимают что я говорю. Здесь чё ни скажи, тут же кто-нибудь за слова цепляться начинает. Причем ведь нормально сказал - функция ИЗ прототипа, т.е. функция, прописанная в прототипе. Что не так???

udaaff 20.08.2007 02:16

Хорошо, в таком случае, донеси до меня смысл заложенный в этой стоке:
Цитата:

Только знаешь, delete this.onEnterFrame из прототипа похоже не работае
Цитата:

У меня на фирме я один дизайнер. И пять программистов (питон, С++ и т.д.)
Все нормально понимают что я говорю.
Они у тебя экстросенсы просто, наверное. :mosking:

Kikasso 20.08.2007 02:45

Цитата:

Сообщение от Wolsh
delete this.onEnterFrame из прототипа похоже не работает :(

По идее должно работать, если вдруг почему-то не хочет удаляться, всегда можно сказать так:
Код:

this.onEnterFrame = null;

altyr 20.08.2007 11:34

С вашего позволения вернусь к основной теме :)
Спасибо за советы, но как-то сложновато и неэлегантно.

А нельзя реализовать такой вариант (извините если говорю что-то не то, просто я в AS пока не очень-то разбираюсь, а мыслю категориями сиплюсплюса):
Отнаследоваться от movieclip'а и создавать все клипы на основе этого класса. У него определить свойство isStopped, соответственно добавить методы что-то типа:

Код:

MyStop
{
isStopped=true;
stop();
}

MyPlay
{
isStopped=false;
play();
}

ну и т.д.

А вообще мне описанная задача кажется очень естественной, наверное каждый второй с ней сталкивается. Неужели нет стандартных решений?

Wolsh 20.08.2007 13:07

ОК, а как Вы будете определять значение isStopped?
---------------------------------------
2 udaaf >>Хорошо, в таком случае, донеси до меня смысл

Тебе объяснить почему я сказал "из прототипа" ? Потому что в коде есть другая onEnterFrame, и я [попытался] указать на ту, что в прототипе.

Или объяснить, что я имею в виду под "не работает"
Здесь я могу ошибаться, поэтому и выразился неуверенно - "похоже не работает". Я вообще-то предположил, что после того как клип выполнил doInit() один раз и записался в листенеры, больше он этого делать не должен (простите за отсутствие слэнга), так как удаляется обработчик события, в котором и записан вызов этой функции doInit(). На деле же все клипы на каждый свой "кадр" посылают крики о помощи.

altyr 20.08.2007 13:18

Цитата:

ОК, а как Вы будете определять значение isStopped?
Ифом. :)
Не понял вопроса...

Wolsh 20.08.2007 13:36

Как Вы узнаете, играет клип или нет?

iNils 20.08.2007 14:06

Цитата:

Сообщение от Wolsh
Только знаешь, delete this.onEnterFrame из прототипа похоже не работает

Я бы с радостью не использовал бы onEnterFrame вобще. А на текущий могу предложить такую замену:
Код:


MovieClip.prototype.onEnterFrame = function () {
 if (!this.flag) {
  trace (this)
  this.flag = true;
  this.doInit ();
 }
};

И удалить this.onEnterFrame.
Или вариант Kikasso с this.onEnterFrame = null. Чтобы понять, почему этот работает, стоит прочитать http://www.flash-mx.ru/forum/topic_show.pl?tid=1819

altyr 20.08.2007 16:22

Код:

Как Вы узнаете, играет клип или нет?
По умолчанию играет (isStopped==false)
Когда делаем ему MyStop - уже не играет (isStopped==true)
Когда надо узнать - ифом ( if(someClip.isStopped ... ) )

Или я опять не понял вопроса? :rolleyes:

А как клипам назначить, что они, мол, другого класса (производного)?

Wolsh 20.08.2007 16:34

Да ведь Вы же сами описали проблему - вовсе не все клипы по-умолчанию играют. Я бы даже сказал, что в обычном проекте, не мультфильме, большинство-то как раз изначально не играет, а запускается при определенных условиях. Клипы-кнопки просто наилучший пример. И если Вы все их запустите, получите невероятный хаос.

altyr 20.08.2007 17:30

Цитата:

Сообщение от Wolsh
Да ведь Вы же сами описали проблему - вовсе не все клипы по-умолчанию играют. Я бы даже сказал, что в обычном проекте, не мультфильме, большинство-то как раз изначально не играет, а запускается при определенных условиях. Клипы-кнопки просто наилучший пример. И если Вы все их запустите, получите невероятный хаос.

Спасибо большое за помощь!

Хорошо, наследуем от movieclip'a - в этом классе объявляем злосчастное свойство isStopped :)
Уже от этого класса наследуем ещё - для кнопок (в конструкторе по умолчанию остановлен), для клипов (соответственно, запущен). Не вижу проблемы или я чего-то не учёл?

Wolsh 20.08.2007 18:24

Я, признаться, одного не понимаю - про саму идею наследования в этом вашем проекте. Я изначально как-то думал, что Вы делаете типа флэш-плеерб и собираетесь играть в нем "чужие" свф-файлы. Потому что если Вы сами собираетесь создавать файлы, над которыми хотите получить контроль, то проблема вообще не понятна - создали, например, в специальном массиве список ссылок на клипы этого файла, которые надо запускать-останавливать + какие-то дополнительные параметры (типа клип с_а после 50 кадра рута больше не запускать)... Ну я не знаю, тут совсем другая история получается.
А если ролики чужие, то уж по-моему сама идея беспросветна. Безглючности не получится. Мало ли как автор загнул там анимацию и связи. Под раздачу может попасть клип, который и должен-то был проиграть один раз три кадра, но так получилось что в этот момент он записался. И вы его запустите. А в нем, быть может, скрипт, который аттачит из библиотеки пару сотен других клипиков... Как Вы собираетесь предусмотреть все эти ситуации? Да возьмите любой сайт с неотключенным меню по правой кнопке и сделайте пару шагов вперед. Всё рухнет, потому что нарушатся все связи. Да что я Вам такие очевидные вещи объясняю... Лучше сформулируйте подробней, чего Вы собственно хотите в конечном результате.


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

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