Как заставить вложенный mc играть без остановки или зацикливания AS3 CS5
У меня проблема с получением вложенного mc
играть без зацикливания.
На главной сцене у меня есть mc
с именем экземпляра smash1_mc
,
В этом MC у меня есть другой MC с именем экземпляра box1_mc
, У него есть простая анимация движения с остановкой на кадре 1. Я поместил метку implode
на кадре 2 из box1_mc
,
То, что я хочу, чтобы произошло, для implode
играть, когда smash1_mc
точка воспроизведения достигает кадра 30; поэтому я поместил ключевой кадр на кадр 30 в слое действий smash1_mc
, в actions
Панель этого ключевого кадра Я пробовал несколько разных вещей.
//When I use the code below, the it only plays the first frame of the "implode" //label instead of the full timeline of box1_mc
addEventListener(Event.ENTER_FRAME, boxSmash);
function boxSmash(event:Event):void
{
box1_mc.gotoAndPlay("implode");
}
//When I use 'play();' instead of gotoAndPlay("implode"); like this…
addEventListener(Event.ENTER_FRAME, boxSmash);
function boxSmash(event:Event):void
{
box1_mc.play();
}
box1_mc
играет полностью, но он зацикливается, несмотря на наличие stop();
действие на последнем кадре. Мне все равно, какой механизм я использую, я просто хочу, чтобы событие кадра вызвало одну полную игру box1_mc
без box1_mc
зацикливаясь независимо после этого. Кажется, что-то простое. Но я не знаю, что не так.
Я могу отправить всю .fla
файл, если это сбивает с толку. На самом деле я работаю над большей вещью для учебного проекта, но я сделал это простым .fla
чтобы продемонстрировать проблему с родительской временной шкалой, контролирующей дочернюю временную шкалу.
1 ответ
Это действительно простая логика. Какой бы код вы ни поместили в энтерфрейм, он будет постоянно выполняться в каждом кадре, поэтому, если вы попросите mc перейти к кадру 2, то это то, что mc будет делать постоянно: переход к кадру 2. Не имеет значения, имеет ли этот mc 1000 кадров для играть, вы говорите, чтобы перейти к кадру 2, и это то, что он делает. Возьми?
Итак, первый случай: box1_mc.gotoAndPlay("implode");
Правильно в каждом кадре ваш mc goto и играть ярлык "взорваться". Это может быть не то, что вы хотите, но это то, что вы просите код сделать.
Второй случай: box1_mc.play();
Правильно mc делает то, что вы спрашиваете: что бы ни было, пока работает энтерфрейм, вы продолжаете играть. И это то, что делает MC.
В обоих случаях mc играет правильно, как вы просите. Теперь, когда вы знаете, что до тех пор, пока работает enterframe, код будет повторяться, и mc будет делать то, что говорит код, вы должны быть в состоянии найти способ остановить это?
РЕДАКТИРОВАТЬ: ответить на ваш комментарий. Это зависит от того, нужен ли вам действительно энтерфрейм. В примере вы показываете, что нет, но это может быть просто примером. Если вам не нужен энтерфрейм, не используйте его, просто позвоните напрямую своему mc и заставьте его играть. Если вам нужен энтерфрейм, вы можете остановить его:
addEventListener(Event.ENTER_FRAME, boxSmash);
function boxSmash(event:Event):void
{
box1_mc.gotoAndPlay("implode");
removeEventListener(Event.ENTER_FRAME, boxSmash);
}
или вы можете проверить, играет ли mc уже
function boxSmash(event:Event):void
{
if(!box1_mc.isPlaying)
{
box1_mc.gotoAndPlay("implode");
}
}
или вы можете создать свой собственный чек:
var mymcisplaying:Boolean;
function boxSmash(event:Event):void
{
if(!mymcisplaying)
{
box1_mc.gotoAndPlay("implode");
mymcisplaying = true;
}
}
и есть даже сотни разных способов сделать это, так что вот только несколько.