PDA

Просмотр полной версии : Останавливается проигрывание gotoAndPlay( )


dendead
25.12.2013, 23:27
Доброго времени суток. Никак не могу понять один свой косяк.

Есть две функции. Одна из них регистрирует событие Event.ENTER_FRAME в мувклипе clip:

public function eatingAnimation( ):void {
clip.addEventListener(Event.ENTER_FRAME, animation);
}

Другая проигрывает анимацию до конца кадров мувклипа, после чего выполняет какие-то действия и удаляет регистрацию:

public function animation(e:Event):void {
clip.gotoAndPlay("animation");

if (clip.currentFrame == clip.totalFrames) {
trace("ВСЕ КАДРЫ ПРОИГРАНЫ");
// КАКИЕ-ТО ДЕЙСТВИЯ
mMouth.removeEventListener(Event.ENTER_FRAME, mouthAnimEating); // удалить регистрацию приёмника
}
}

А проблема в том, что после регистрации события, timeline переходит на следующий кадр после "animation" и останавливается. При этом, если я использую: clip.play( ); вместо: clip.gotoAndPlay("animation"); анимация проигрывается но, естественно, с самого начала мувклипа. Именно при переходе по кадрам начиная от метки "animation" воспроизведение останавливается, также и при: clip.gotoAndPlay(номер_кадра);

shmaser
25.12.2013, 23:33
gotoAndPlay вызывается каждый кадр постоянно заново с метки "animation", т.к. находится в слушателе события Event.ENTER_FRAME.

dendead
25.12.2013, 23:36
Точно. А можно ли как-то заставить flash проиграть полностью все кадры клипа, прежде чем совершать какие-то действия, без использования Event.ENTER_FRAME?

shmaser
25.12.2013, 23:44
clip.gotoAndPlay("animation");переместите в функцию eatingAnimation

dendead
25.12.2013, 23:53
Тогда на момент проверки:
if (clip.currentFrame == clip.totalFrames) clip.currentFrame и clip.totalFrames всегда неравны и flash никогда не доберётся до // КАКИЕ-ТО ДЕЙСТВИЯ.

Akopalipsis
25.12.2013, 23:57
А если менять по EnterFrame номера кадров?
//где то в коде
private var numFrame:int=0;
//в обработчике EnterFrame
clip.gotoAndPlay(numFrame);
numFrame++;

shmaser
26.12.2013, 00:02
Разве так не работает?
public function eatingAnimation( ):void {
clip.gotoAndPlay("animation");
clip.addEventListener(Event.ENTER_FRAME, animation);
}
public function animation(e:Event):void {
if (clip.currentFrame == clip.totalFrames) {
trace("ВСЕ КАДРЫ ПРОИГРАНЫ");
// КАКИЕ-ТО ДЕЙСТВИЯ
clip.removeEventListener(Event.ENTER_FRAME, animation);
}
}

dendead
26.12.2013, 00:12
shmaser, при таком подходе gotoAndPlay не работает.

Добавлено через 1 минуту
Я оставил play( ) и передвинул некоторые кадры на timeline. Этим и решил проблему. Спасибо, shmaser за первоначальную наводку.

Добавлено через 11 минут
Хотя всё же play( ) всё равно портит общую картину... Буду думать.

Добавлено через 21 минуту
Вот теперь точно получилось с помощью примера Akopalipsis.
Большое спасибо всем. Не первый раз выручаете.

caseyryan
26.12.2013, 10:19
shmaser, при таком подходе gotoAndPlay не работает.
Не может быть. Значит у вас где-то еще есть код, создающий проблемы

dendead
26.12.2013, 17:19
Буду проверять.