Как заставить вложенный 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;
    }
}

и есть даже сотни разных способов сделать это, так что вот только несколько.

Другие вопросы по тегам