PDA

Просмотр полной версии : при остановке одного mc почему-то останавливается другой (исходник тут)


dtmax
20.08.2003, 23:34
Привет!

Подскажите плз, так и должно быть, или я в чем-то туплю...
Аттачу из root'a клип, в середине останавливаю его, и там же аттачу другой клип.

Ожидал, что второй клип начнет играть, ан-нет...
Он тоже стоит на первом кадре, play() не помогает...

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

Посмотрите плз, исходник для MX я приаттачил...

DUDE
20.08.2003, 23:46
А они не на один level аттачатся??

sergwizard
21.08.2003, 01:56
Может быть, вот так?

dtmax
21.08.2003, 12:21
2 DUDE: аттачатся на один level (_level0)... Как приаттачить на разные, я не знаю... Или ты имел в виду depth? Depth у них разный, а иначе второй клип "затирает" первый...

2 sergwizard: спасибо за помощь, у тебя все работает как надо... Я пока еще не понял, почему не работало у меня, буду сравнивать, анализировать, разбираться... А вообще у меня складывается такое впечатление, что ActionScript не совсем "строгий" язык...

dtmax
21.08.2003, 12:58
Посмотрите плз, у кого есть время...
Должно работать, но не работает...
В первом кадре _level0 у меня такое написано:


function motionClip(){}
motionClip.prototype = new MovieClip();
motionClip.prototype.condition=true; //просто какое-то условие
motionClip.prototype.dir=1; //direction of playing
motionClip.prototype.onEnterFrame = function()
{
if (this._currentframe == this._totalframes) //последний кадр
{
if(this.condition==true)
{
//_root.attachMovie('circle2','circle2',2);
//если аттачить тут, то не работает
//а если из последнего фрейма circle1, то работает...
this.stop();
}
else
this.dir = -1;
}
if (this.dir == -1)
{
//проигрывание назад, но это не относится к вопросу
if (this._currentframe>1)
this.gotoAndStop(this._currentframe-1);
else
this.stop();
}
};

Object.registerClass('circle1', motionClip);
//аттачится первый клип, из которого потом
//будет аттачиться второй
_root.attachMovie('circle1','circle1',1);

stop();


Ну почему если аттачить клип №2 (circle2) из обработчика OnEnterFrame, то оба клипа останавливаются, а если аттачить из последнего кадра circle1 - все работает????

Пушистик
21.08.2003, 13:17
я может быть не догнал проблему, но может так...?

dtmax
21.08.2003, 13:25
Привет, Пушистик!

Ты "догнал" проблему ;))

В твоем примере - все работает, но у меня в том что я делаю на флеше, нужно обработчик onEnterFrame для клипа circle1 сделать программно - ну система такая... Так вот когда я его делаю программно, и из последнего кадра аттачу второй клип circle2, то оба клипа останавливаются.
А вот если аттачить из последнего кадра circle1, выбрав на линейке последний кадр и прописав там аттач, как это у тебя сделано, то все работает...
В принципе, жить можно и так, но как-то не универсально получается - в нескольких клипах писать в кадрах action'ы... Я хотел все в prototype запихнуть...

Пушистик
21.08.2003, 13:25
вот!из первого кадра!

dtmax
21.08.2003, 13:31
Вообще, очень приятно, что люди отрываются от своих дел, и помогают... Хороший сайт...

Пушистик
21.08.2003, 13:39
а ты не пробовал задавать новое имя?:)
вот тут:
_root.attachMovie('circle2', 'circle2 ', 2);
тоже иногда бывает полезно.....

dtmax
21.08.2003, 13:55
Ага, пробовал, не помогало ;)
Буду разбираться, спасибо за исходники...

Nox Noctis
21.08.2003, 15:26
все просто™ :) смотри:

каждый кадр {
если (кадр последний) И если (условие) { АТТАЧ; стоп; }
}

то есть как только первый клип доходит до последнего кадра, в КАЖДОМ следующем кадре начинает срабатывать аттач. и каждый кадр на сцене появляется НОВЫЙ второй клип, который стирает предыдущую его копию и начинает играть с начала... то есть визуально получается что он стоит в первом кадре. а нужно чтобы аттач сработал только один раз.

вот, например, так работает:
(и первый клип сразу назад проигрываться начинает...)
motionClip.prototype.onEnterFrame = function() {
if (this._currentframe == this._totalframes) {
if (this.condition == true) {
_root.attachMovie('circle2', 'circle2', 2);
this.condition = false;

dtmax
21.08.2003, 21:09
Nox Noctis - спасибо!

Это было то, что нужно!
А не знаешь случайно, почему для первого клипа в последнем кадре постоянно возникает событие onFrameEnter, хотя я делаю клипу stop(), и визуально он находится в последнем кадре?

Это уже чисто теоретический вопрос для меня...

derhab
21.08.2003, 21:43
Ну stop() и onEnterFrame совершенно разные вещи..если хочешь уничтожить onEnterFrame в клипе пиши
delete this.onEnterFrame... если я правильно понял вопрос.