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

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


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

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