0

私は(これまでのところ成功していませんが)ステージ上のオブジェクトのスケールをプログラムで増減しようとしています。成長ボタン(grow_btn)と縮小ボタン(shrink_btn)があり、選択したオブジェクト(redObject、greenObject、blueObject)のscaleXプロパティとscaleYプロパティを時間の経過とともに増減します。

私が遭遇している問題はランダムに見えます。プロパティの1つ(scaleXまたはscaleY)のみが変更され、もう1つは変更されない場合があります。さらに、トゥイーン機能のターゲットサイズと元のサイズが正しく調整されません。例:1.0は、ステージ上のオブジェクトのほぼ2倍の大きさです。

//Imports
import fl.transitions.Tween;
import fl.transitions.easing.*;

//Constants And Variables
const starRotationAngle:Number = 0.5;
const starSpeed:Number = 2;

var moveForward:Boolean = true;
var selectedObject:MovieClip;

//Event Listeners & Functions
star_mc.addEventListener(MouseEvent.CLICK, rotateStar);
function rotateStar(e:MouseEvent):void
    {
    star_mc.rotation += 5;
    }

addEventListener(Event.ENTER_FRAME, starMove);
function starMove(e:Event):void
    {
    if (star_mc.x >= stage.stageWidth + star_mc.width)
        {moveForward = false;}
    else if (star_mc.x <= stage.x - star_mc.width)
        {moveForward = true;}

    if (moveForward == true)
        {
        star_mc.x += starSpeed;
        star_mc.rotation += starRotationAngle;
        }       
        else
        {
        star_mc.x -= starSpeed;
        star_mc.rotation -= starRotationAngle;
        }   
    }

redObject.addEventListener(MouseEvent.CLICK, changeSelectedObjectVariable);
greenObject.addEventListener(MouseEvent.CLICK, changeSelectedObjectVariable);
blueObject.addEventListener(MouseEvent.CLICK, changeSelectedObjectVariable);
function changeSelectedObjectVariable(e:MouseEvent):void
    {
    selectedObject = e.currentTarget as MovieClip;
    }

grow_btn.addEventListener(MouseEvent.CLICK, grow);
function grow(e:MouseEvent):void
    {
    var tweenGrowX:Tween = new Tween(selectedObject, "scaleX", None.easeIn, 1.0, 2.0, 3.0, true);
    var tweenGrowY:Tween = new Tween(selectedObject, "scaleY", None.easeIn, 1.0, 2.0, 3.0, true);
    }

shrink_btn.addEventListener(MouseEvent.CLICK, shrink);
function shrink(e:MouseEvent):void
    {
    var tweenShrinkX:Tween = new Tween(selectedObject, "scaleX", None.easeIn, 2.0, 1.0, 3.0, true);
    var tweenShrinkY:Tween = new Tween(selectedObject, "scaleY", None.easeIn, 2.0, 1.0, 3.0, true);
    }
4

3 に答える 3

2

トゥイーンオブジェクトをリスナー関数の外に移動し、grow()とshrink()の両方に異なるトゥイーンオブジェクトを使用しないでください。あなたの問題は、新しいトゥイーンを適用する前に前のトゥイーンを破壊していないため、互いに踏んでいることだと思います。

var tweenScaleX:Tween;
var tweenScaleY:Tween;

grow()メソッドとshrink()メソッドはどちらも、メソッド内にトゥイーン変数を作成する代わりに、これら2つのトゥイーン変数を使用する必要があります(これにより、トゥイーンが完了していなくても、関数が完了したときにガベージコレクションに使用できるようになります)。grow()を呼び出すと、tweenScaleXとtweenScaleYの両方に新しいトゥイーンオブジェクトが割り当てられます。grow()が終了する前に縮小ボタンをクリックすると、shrink()メソッドが開始され、grow()中に割り当てられたトゥイーンは基本的に「破棄」され、新しい縮小トゥイーンに道を譲ります。

さらに、問題はAS3のガベージコレクションに関連している可能性があります。提供された最初の回答は、コードは正常に機能することを示していますが、ガベージコレクションは、パフォーマンスとメモリの可用性のためにコンピューターごとに異なります。メモリを大量に消費するFlashアプリは、ガベージコレクションをより頻繁に実行しますが、メモリとパフォーマンスが多いボックスでは、まったく実行されない場合があります。上で述べたように、grow()関数とshrink()関数内にトゥイーン変数を作成しているので、それらのスコープはその関数内にのみあります。関数が完了すると、関数内で作成された変数がガベージコレクションの対象になります。トゥイーンが終了していなくてもガベージコレクションが発生すると、トゥイーンオブジェクトは破棄されます(「complete」イベントは発生しません)。トゥイーン変数を例の関数の外に移動する(またはそれらをクラスのクラスメンバーにする)ことにより、スコープを親オブジェクトに移動し、その親が存在する限りトゥイーンが存在するようにします。ガベージコレクションへの変更は、AS2からAS3への最も重要ですが、おそらく最も理解されていない変更の1つです。開発者はRAMを大量に使用しているため、ガベージコレクションは頻繁ではありません(または、すべてを保持するのに十分なメモリがある限り存在しません)が、本番環境では、アイテムがガベージコレクションされて解放されるため、ユーザーが奇妙な動作をする可能性があります。 RAMですが、これらのアイテムはまだ存在していると思っていたため、他の場所で参照されており、コードは正常に機能します。

于 2010-02-21T06:00:45.703 に答える
1

あなたのコードは正しいです。正常に動作します。変換パネルでムービークリップのスケールを確認してください。100 100 に設定する必要があります。

于 2010-02-20T23:51:08.227 に答える
0

関数内でトゥイーン オブジェクトを宣言しないでください。トゥイーンが終了する前に CG によってクリーンアップされます。それらをグローバルに宣言します。

正しくない:

function grow(e:MouseEvent):void
{
    var tweenGrowX:Tween = new Tween(selectedObject, "scaleX", None.easeIn, 1.0, 2.0, 3.0, true);
    var tweenGrowY:Tween = new Tween(selectedObject, "scaleY", None.easeIn, 1.0, 2.0, 3.0, true);
}

正しい:

var tweenGrowX:Tween;
var tweenGrowY:Tween;
function grow(e:MouseEvent):void
{
    tweenGrowX = new Tween(selectedObject, "scaleX", None.easeIn, 1.0, 2.0, 3.0, true);
    tweenGrowY = new Tween(selectedObject, "scaleY", None.easeIn, 1.0, 2.0, 3.0, true);
}
于 2012-02-20T16:44:47.870 に答える