1

Actionscript 3 (Flash CS5) で、クリックするとステージから卵 (今のところ円) を生成し、(コード化された) トゥイーンでクリックした場所に卵を送るプログラムを作成しました。さらに、3D の錯覚を与えるためにスケーリングします。

卵のトゥイーンの 1 つに TweenEvent.MOTION_FINISH を追加して、モーションがいつ終了するかを確認します。そうなったら、元のマウス クリックと同じ座標で新しいオブジェクト (Splat と呼ばれる) を作成します。

問題 1:下の図に示すように、Splat オブジェクトが正しい場所に追加されていません。座標を確認すると、エッグクラスとスプラッシュクラスの両方で一致しています。また、両方のオブジェクトの登録ポイントがそれらの中間にあることも確認しました。最後に、問題の原因がスケールであるかどうかを確認しましたが、スケール トゥイーンを削除しても同じ問題が発生します。

(編集: 卵は正しい場所に配置されます。マウス クリックの元の座標は本来あるべきものです。位置がずれているように見えるのは、星のオブジェクトのみです。)

http://i45.tinypic.com/24bj1h3.png

問題 2: Splat オブジェクトは Egg オブジェクトと同じ量だけ縮小されます。どうしてこれなの?Splash を Egg に依存させるつもりはありません。

そして、ここに関連するコードがあります:

package  
{
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.MouseEvent;

public class eggMain extends MovieClip
{
    import flash.events.Event;

    public function eggMain() 
    {
        stage.addEventListener(MouseEvent.CLICK, spawn);
    }

    function spawn(event)
    {
        for(var i:int = 0; i<1; i++)
        {
            trace("mX in main class = " + mouseX);
            trace("mY in main class = " + mouseY);
            var e:Egg = new Egg(mouseX, mouseY);
            addChild(e);

        }
    }
}
}


package  
{
import flash.display.MovieClip;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;


public class Egg extends MovieClip 
{
    var stageWidth:int = 550;
    var stageHeight:int = 400;
    var buffer:int = 100;
    var mX = 0;
    var mY = 0;

    public function Egg(moX:int, moY:int) //mouseX, mouseY
    {
        mX = moX;
        mY = moY;
        trace("mX in Egg constructor: " + mX);
        trace("mY in Egg constructor: " + mY);

        spawnAtFixedPoint();
        animate();
    }




    function spawnAtFixedPoint()
    {
        this.x = stageWidth + buffer;
        this.y = stageHeight - buffer;
    }

    //Moves the egg in from the spawn point using tweens. Scales down on the way to give 3D illusion.
    function animate()
    {
        var xMovement:Tween;
        var yMovement:Tween;
        var xScale:Tween;
        var yScale:Tween;

        trace("mX in animate() = " + mX);
        trace("mY in animate() = " + mY);
        xMovement = new Tween(this, "x", Regular.easeOut, this.x, mX, 1, true); //obj, property, ease function, start, time, in seconds (true)
        yMovement = new Tween(this, "y", Regular.easeOut, this.y, mY, 1, true);
        xScale = new Tween(this, "scaleX", Regular.easeIn, 1, 0.1, 1, true);
        yScale = new Tween(this, "scaleY", Regular.easeIn, 1, 0.1, 1, true);


        //Checks when the object has finished animating (which mean the egg has landed)
        xMovement.addEventListener(TweenEvent.MOTION_FINISH, splat);
    }

    //Spawns a splat (currently a star) at the same coordinates as the egg
    function splat(event)
    {
        trace("mX in splat() = " + mX);
        trace("mY in splat() = " + mY);
        var s = new Splat(mX, mY);
        addChild(s);
    }

}
}

更新: カスタム SplatEvent を作成し、メイン クラスにそれをリッスンさせました。イベントは MOTION_FINISHED ハンドラーでディスパッチされます。できます!

ただし、卵の着陸の元の座標を返すために、メイン クラスで public static vars を使用して機能させる必要がありました。メインクラスのように:

public static var splatX:int;
public static var splatY:int;

Egg クラスでは次のようになります。

eggMain.splatX = mX;
eggMain.splatY = mY;

私はそれを受け入れることができますが、グローバル変数を使用したくないです。主な質問には答えていますが、これについての提案を行っています。ありがとう。

4

1 に答える 1

1

卵のインスタンス内にスプラットを作成し、それを卵の表示リストに追加します。これは、スプラット(星)が卵の座標空間に作成されるため、ステージ上の卵の位置によってオフセットされることを意味します。また、スプラットは、変換された卵インスタンスの子であるため、スケールなど、卵に対して行った変換を継承することも意味します。

より良いアプローチは、メインクラスでエッグのモーションフィニッシュイベント(イベントバブリングを見てください)またはモーションフィニッシュハンドラーから発生するカスタムイベントのいずれかをリッスンすることです。そのイベントを受信したら、splatのインスタンスを作成し、それをメインクラスの表示リストに追加します。

于 2012-05-05T22:01:03.840 に答える