AS3: Tween Lite: подростки останавливаются до того, как они закончат? - PullRequest
1 голос
/ 11 января 2011

edit2: Ну, я понял, что случилось. ответил на мой собственный вопрос. * Лицо-ладонь * извините за эту трату пространства. (если вы столкнетесь с этим случайно, мое решение будет дано внизу)

Редактировать: Обдумывая мой код, пытаясь найти решение, я заметил, что когда мой .swf зависает во время анимации, анимационный видеоклип, который находится на сцене, также останавливает середину анимации. , что заставляет меня поверить, что мои проблемы могут быть связаны с загрузкой / созданием части кода моего кода В результате вот моя функция загрузки, чтобы дополнить код ниже:

function loadImage():void {

    //if it's not already been loaded)
    if ((currentImageNbr+1) > imagesLoaded || images.length == 0) {

        imagesLoaded++;

        tempPic = xmlData.album[albumNum].image[currentImageNbr].attribute("file");
        tempCaption = xmlData.album[albumNum].image[currentImageNbr].attribute("caption");
        trace("Loading: "+galleryPath+tempPic+" ("+tempCaption+")");

        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, catchIOError);

        loader.load(new URLRequest(galleryPath+tempPic));
        images[currentImageNbr] = loader;
        paths[currentImageNbr] = tempPic;
        captions[currentImageNbr] = tempCaption;
        //loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onImgProgress); (not incorporated yet.)

        loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onImgComplete);
    }
    else {
        trace("image already loaded.");
        onImgComplete(null);
    }
}

Исходное сообщение: Привет снова StackOverflow!

Мне может быть немного сложно объяснить мою проблему, поэтому, пожалуйста, пошутите, если у меня нет особого смысла ..

Я пытаюсь создать (достаточно простую) галерею изображений XML. XML и часть загрузки (по большей части) прекрасны и хороши. У меня проблемы с использованием TweenLite от Greensock, чтобы мои картинки скользили по сцене.

движение, которое я пытаюсь достичь, выглядит примерно так:

  1. создать мое изображение справа от сцены
  2. поверните направо и остановитесь в центре сцены
  3. затем, когда я переключаюсь на следующее изображение, я хочу, чтобы текущее изображение исчезло со сцены слева
  4. быть удаленным
  5. создать новый слайд за пределами сцены справа
  6. и, наконец, справа налево
  7. и т.д.

Мой код работает отлично, когда я запускаю его, используя Ctrl + Enter во флэш-памяти, но когда я запускаю свой .swf в браузере, изображения часто не отображаются правильно.

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

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

Я все еще очень плохо знаком с использованием TweenLite, поэтому не слишком хорошо знаю его входы и выходы .. Возможно, я неправильно создаю своих подростков?

Вот некоторые соответствующие фрагменты кода, которые, я думаю, являются, вероятно, проблемными областями, если вы заметите меня, используя неправильный метод или ошибку, пожалуйста, дайте мне знать, я все еще изучаю ActionScript 3:

несколько предпосылок (что может быть важно?)

import com.greensock.*;
import com.greensock.easing.*;

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

stage.addEventListener(Event.RESIZE, resizeHandler, false, 0, true);

загрузить мое изображение (есть больше внутри этой функции, но я не беспокоюсь об этой части)

loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onImgComplete);

После загрузки:

function onImgComplete(e:Event):void {
    trace("loading done");

    // check if containerSp exists on stage 
    // if it does, tween it, on complete- delete it and make a new one.
    if (containerSp.stage) {
        trace("containerSp already exists. removing, then making a fresh one");

        // need to check if we're going forwards or backwards.
        if (leftRight == "right") {
            //forwards
            trace("tweening out..");
            moving = true;

            TweenLite.to(containerSp, .5, {x:0-(containerSp.width+20), y:containerSp.y, ease:Quint.easeIn, onComplete:removeSprite}); 
        }
        else if (leftRight == "left") {
            //backwards
            trace("tweening out..");
            moving = true;

            TweenLite.to(containerSp, .5, {x:stage.stageWidth+20, y:containerSp.y, ease:Quint.easeIn, onComplete:removeSprite});
        }
    }
    else {
        trace("containerSp doesn't exist. making a fresh one.");
        makeSprite();
    }
}

Когда анимация закончится, удалите изображение и создайте новый спрайт:

function removeSprite():void {
    moving = false;
    stage.removeChild(containerSp);
    makeSprite();
}

Сделать мое изображение внутри containerSp (который еще не был добавлен на сцену):

function makeSprite():void {
    containerSp = new Sprite();
    containerSp.graphics.beginFill(0xFF0000);
    containerSp.graphics.drawRect( 0, 0, 0, 0);
    trace("Done.");

    trace("making image");
    var bm:Bitmap = new Bitmap();
    bm = Bitmap(images[currentImageNbr].content);
    bm.smoothing = true;

    containerSp.addChild(bm);

    trace("done");
    tweenIn();
}

установите позицию нашего containerSp, добавьте ее на сцену и добавьте в нее:

function tweenIn():void {
    moving = true;
    resizeHandler();

    // need to check if we're going forwards or backwards.
    if (leftRight == "right") {
        //forwards
        containerSp.y = (stage.stageHeight/2)-(containerSp.height/2)-(barHeight/2);
        containerSp.x = stage.stageWidth;
    }
    else if (leftRight == "left") {
        //backwards
        containerSp.y = (stage.stageHeight/2)-(containerSp.height/2)-(barHeight/2);
        containerSp.x = (0 - stage.stageWidth);
    }

    stage.addChild(containerSp);

    trace("tweening in..");

    TweenLite.to(containerSp, .5, {x:(stage.stageWidth/2)-(containerSp.width/2), y:(stage.stageHeight/2)-(containerSp.height/2)-(barHeight/2), ease:Quint.easeOut, onComplete:done}); 
}

function done():void {
    trace("all done");
    moving = false;
    resizeHandler();
}

Использование resizeHandler для изменения размера моей картинки при изменении размера окна. он в основном устанавливает containerSp.width, .height, .x и .y относительно размера кадра.

переменная moving предназначена для resizeHandler, поэтому X и Y не устанавливаются в центр сцены, если изображение не движется.

Итак, чтобы подвести итог моего вопроса, почему подростки перестают работать, пока они не закончили, только когда я загружаю свой .swf в браузер?

если я забыл что-то упомянуть, пожалуйста, дайте мне знать, и я буду рад заполнить пробелы.

Заранее спасибо за ваше время и терпение.

Ответы [ 2 ]

1 голос
/ 11 января 2011

Вы пробовали метод killTweensOf () ?

0 голосов
/ 13 января 2011

Так что это вовсе не вина TweenLite. Оказывается, размер загружаемых мной изображений не был дружественным к Интернету. с какой флэш-памятью не справиться (по крайней мере, с моей лапы), поэтому даже после того, как я загрузил свои изображения в кеш и все остальное, в тот момент, когда я добавил этого бегемота из мувиклипа на сцену, завис .swf при попытке за работой. Таким образом, подростки были на самом деле срабатывали правильно. Я выяснил все это, создав меньший прототип с размером 40x40 .gif и применив его к своему проекту.

В качестве решения (помимо сокращения и оптимизации моих изображений), при загрузке нового изображения вместо добавления его на сцену ПОСЛЕ того, как предыдущее изображение было удалено (даже если оно уже загружено), я заставил его добавить мувиклип на сцену как часть процесса загрузки, чтобы при добавлении фрагмента ролика подростки не выглядели безобразно.

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

...