1

编辑2:好吧,我发现出了什么问题。回答了我自己的问题。* 掌心* 很抱歉浪费了空间。(如果您随机遇到此问题,我的解决方案将在底部回答)

编辑:在考虑我的代码试图找到解决方案时,我注意到当我的 .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 和加载部分(在大多数情况下)很好而且很花哨。我的问题是使用 greensock 的 TweenLite 让我的照片滑入和滑出舞台。

我想要实现的动作有点像这样:

  1. 从舞台右侧创建我的图像
  2. 从右侧呼啸而过,停在舞台中央
  3. 然后当我切换到下一张图片时,我希望当前图片从舞台左侧飞出
  4. 被删除
  5. 在右侧舞台外创建一个新幻灯片
  6. 最后,从右边冲进来
  7. ETC

当我在 Flash 中运行它时,我的代码运行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变量是 forresizeHandler所以它不会将Xand设置Y到舞台的中心,除非图片没有移动。

所以总结一下我的问题,为什么只有当我在浏览器中加载我的 .swf 时,补间才会在完成之前停止工作?

如果我忘记提及任何内容,请告诉我,我很乐意填补空白。

提前感谢您的时间和耐心。

4

2 回答 2

1

你试过killTweensOf()方法吗?

于 2011-01-11T15:04:02.570 回答
0

所以这根本不是 TweenLite 的错。原来我正在加载的图像大小不是网络友好的;哪个闪存无法处理(至少在我的笔记本电脑上..)所以即使在我将图像加载到缓存和所有内容之后,当我将 MovieClip 的庞然大物添加到舞台时,.swf 会在试图保持时挂起在职的。所以补间实际上是正确触发的。我通过制作一个 40x40 .gif 的较小原型并将其应用到我的项目中发现了这一切。

作为一种解决方案(除了缩小和优化我的图像),在加载新图像时,而不是在删除前一个图像之后将其添加到舞台(即使它已经加载),我已经将影片剪辑添加到舞台作为加载过程的一部分,这样当添加影片剪辑时,补间不会看起来很丑。

无论如何,感谢任何查看我的代码和/或线程的人。再提一些建议会很好,但我意识到这篇文章相当大而且乏味。

于 2011-01-13T11:40:53.707 回答