AS3: Почему эти компиляторы пропускают строку Tweenlite?

Я использую Tweenlite и Starling в AS3. Все работает, но при последней перезаписи компилятор просто игнорирует команду Tweenlite и просто вылетает с этой ошибкой:

[Ошибка] исключение, информация = не определено

на com.greensock.core::Animation()[/Active/_Flash/_AS3_v12/src/com/greensock/core/Animation.as:210]

на com.greensock::TweenLite()[/Active/_Flash/_AS3_v12/src/com/greensock/TweenLite.as:445]

на com.greensock::TweenLite$/to()[/Active/_Flash/_AS3_v12/src/com/greensock/TweenLite.as:919]

это код, в котором возникает ошибка:

private function down():void {
    TweenLite.to(square, stage.stageHeight / 200, {y: stage.stageHeight - 50, ease: Linear.easeNone});
    if (stopped){
        TweenLite.to(square, square.y / 200, {y: 50, ease: Linear.easeNone});
        stopped = !stopped;
        rRight();
    } else {
        right();
    }
}

если я удалю оператор if, происходит подростковый возраст, если я оставлю его, все рухнет. Я не понимаю, почему компилятор пропускает анимацию.

Вот остальная часть кода, которая имеет отношение:

public class Square extends Sprite implements ISquare {

public const square:Quad = new Quad(100, 100);
private var stopped:Boolean;

public function Square() {
}

public function draw():void{
    addChild(square);
    square.pivotX = square.width / 2;
    square.pivotY = square.height / 2;
    square.x = 50;
    square.y = 50;

    stopped = new Boolean(false);
    down();
}

...

public function reverseDirection():void{
    stopped = !stopped;
    TweenLite.killTweensOf(square);
}

private function down():void {
    TweenLite.to(square, stage.stageHeight / 200, {y: stage.stageHeight - 50, ease: Linear.easeNone});

    if (stopped){
        TweenLite.to(square, square.y / 200, {y: 50, ease: Linear.easeNone});
        stopped = !stopped;
        rRight();
    } else {
        right();
    }
}

private function right():void {
    TweenLite.to(square, stage.stageWidth / 200, {x: stage.stageWidth - 50, ease: Linear.easeNone});
    if (stopped){
        TweenLite.to(square, square.x / 200, {x: 50, ease: Linear.easeNone});
        stopped = !stopped;
        rUp();
    } else {
        up();
    }
}
...

Источник контекста. (Квадрат.as)


person ozr3n    schedule 22.07.2014    source источник
comment
if (stopped == true) Вы столкнулись с одним знаком уравнения под if.   -  person Vesper    schedule 22.07.2014
comment
ОМГ мне стыдно. Настоящий нуб... Спасибо   -  person ozr3n    schedule 22.07.2014
comment
Я пробовал, и это не решает ошибку.   -  person ozr3n    schedule 22.07.2014
comment
Какую версию твинлайта вы используете?   -  person Pimgd    schedule 22.07.2014
comment
Я только что обновился до v12, и ошибка сохраняется. (Хотя немного другое. Редактирование Q... Там.)   -  person ozr3n    schedule 22.07.2014
comment
Вероятно, вы массово запускаете конфликтующие твины, поэтому TweenLite ведет себя не так, как предполагалось, и в конечном итоге вылетает из-за ошибок нехватки памяти.   -  person Vesper    schedule 22.07.2014
comment
Итак, вы предлагаете использовать on complete в vars? Есть ли другой способ? (чтобы не пришлось заново все переписывать)   -  person ozr3n    schedule 22.07.2014
comment
@Vesper Ты был прав. Я добавил отсутствующий onComplete. Спасибо!   -  person ozr3n    schedule 22.07.2014


Ответы (1)


Значит, внутри Tweenlite что-то идет не так. Что конкретно, я не знаю.

Вы говорите, что когда вы удаляете оператор if, все идет хорошо.

И что раньше все было нормально.

Учитывая ваши предыдущие вопросы, я утверждаю, что раньше все было не так хорошо. Это первый раз, когда ваша программа действительно работает. Это первый раз, когда он действительно анимируется и проходит через весь код, как вы его написали.

И, глядя на код, а также на часть декомпилированного кода, который я нашел в Интернете, я думаю, что это связано с этим:

Вы не ждете, пока ваши подростки закончат.

В настоящее время вы выполняете код следующим образом, после того как он был добавлен: (я добавил комментарии, чтобы объяснить, что происходит)

private function down():void {
    TweenLite.to(square, stage.stageHeight / 200, {y: stage.stageHeight - 50, ease: Linear.easeNone});
    //1x tween started
    if (stopped){//I dunno where it goes, it goes A here...
        TweenLite.to(square, square.y / 200, {y: 50, ease: Linear.easeNone});//2nd tween
        stopped = !stopped;
        rRight();//and then here
    } else {//or it goes B here
        right();//and then here
    }
}

private function right():void {
    TweenLite.to(square, stage.stageWidth / 200, {x: stage.stageWidth - 50, ease: Linear.easeNone});
    //B path - 2nd tween started
    if (stopped){//idk, but
        TweenLite.to(square, square.x / 200, {x: 50, ease: Linear.easeNone});//either 3rd
        stopped = !stopped;
        rUp();//and on and on
    } else {//or
        up();//on and on anyway
    }
}

private function rRight():void {
    TweenLite.to(square, stage.stageWidth / 200, {x: stage.stageWidth - 50, ease: Linear.easeNone});
    //A path - 3rd tween started
    if (stopped){//idk which way, but
        TweenLite.to(square, square.x / 200, {x: 50, ease: Linear.easeNone});//4th
        stopped = !stopped;
        down();//and on and on
    } else {//or
        rDown();//still on and on and on
    }

}

Происходит то, что у вас есть бесконечный цикл, и что-то в Tweenlite РАЗРЫВАЕТСЯ.

Вероятно, что он должен обработать все твины, которые вы успели добавить, пока Tweenlite ждал ENTER_FRAME. Глядя на документацию, кажется, что вы можете добавить параметр onComplete в вашем третьем аргументе вашего TweenLite.to вызова. Вы помещаете туда функцию, и она будет вызываться, когда анимация будет завершена. Дополнительные сведения можно найти в документации для по завершении.

person Pimgd    schedule 22.07.2014
comment
Я только что написал @Vesper, что он пишет. отсутствовал onComplete. :) - person ozr3n; 22.07.2014