1

edit2:何が悪いのかわかりました。私自身の質問に答えました。* Face-palm* この無駄なスペースで申し訳ありません。(これをランダムに見つけた場合、私の解決策は下部に回答されています)

編集:解決策を見つけようとしてコードを熟考しているときに、.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. そして最後に右からスウッシュイン

私のコードCtrl + Enterは、Flash で実行すると完全に動作しますが、ブラウザで .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変数は for であるため、画像が動いていない限り、andをステージの中心にresizeHandler設定しません。XY

私の質問を要約すると、ブラウザーで .swf をロードしたときにのみ、トゥイーンが終了する前に動作を停止するのはなぜですか?

何か言い忘れがあればお知らせください。喜んで空欄を埋めさせていただきます。

どうぞよろしくお願いいたします。

4

2 に答える 2

1

killTweensOf()メソッドを試しましたか?

于 2011-01-11T15:04:02.570 に答える
0

つまり、TweenLite のせいではありません。読み込んでいた画像のサイズがウェブに適していないことがわかりました。どのフラッシュが (少なくとも私のラップトップでは..) 処理できなかったので、イメージをキャッシュとすべてにロードした後でも、その巨大なムービークリップをステージに追加した瞬間、保持しようとして .swf がハングしました。働く。したがって、トゥイーン実際には正しくトリガーされていました。40x40 の .gif で小さなプロトタイプを作成し、それを自分のプロジェクトに適用することで、これらすべてを見つけました。

解決策として(画像の縮小と最適化以外に)、新しい画像をロードするときに、前の画像が削除された後にステージに追加するのではなく(すでにロードされている場合でも)、ムービークリップをステージに追加するようにしましたロード プロセスの一部として、ムービー クリップが追加されたときにトゥイーンが見苦しくならないようにします。

とにかく、私のコードやスレッドを見てくれた人に感謝します。もう少し提案があればよかったのですが、この投稿はかなり大きくて退屈だったと思います。

于 2011-01-13T11:40:53.707 に答える