0

forループを使用して、ステージに複数のオブジェクトを追加しています。そこからオブジェクトをアニメートしたいのですが、試してみると、ボールの1つだけが移動します。

これが私のコードです。

(ボールは外部クラスからプルされます)

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite
    {

        private var ball:Ball;
        private var ax:Number = 4;

        public function Main()
        {
            init();
        }
        private function init():void
        {
            for(var i:Number = 0; i < 10; i++)
            {
                ball = new Ball();
                ball.x = Math.random() * stage.stageWidth;
                ball.y = Math.random() * stage.stageHeight;
                addChild(ball);
            }

            addEventListener(Event.ENTER_FRAME, onEnterFrame1);
        }
        private function onEnterFrame1(event:Event):void
        {
            ball.x += ax;
        }
    }
}

ありがとうございました!

4

3 に答える 3

2

すべてのオブジェクトを配列にプッシュし、各ボールの x プロパティを変更する必要があります。

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite
    {
        private var ball:Ball;
        private var ax:Number = 4;

        private var balls:Array;

        public function Main()
        {
            init();
        }

        private function init():void
        {
            balls = new Array();
            for(var i:Number = 0; i < 10; i++)
            {
                ball = new Ball();
                ball.x = Math.random() * stage.stageWidth;
                ball.y = Math.random() * stage.stageHeight;
                addChild(ball);

                balls.push(ball);
            }

            addEventListener(Event.ENTER_FRAME, onEnterFrame1);
        }
        private function onEnterFrame1(event:Event):void
        {
            for(var i:int = 0; i < balls.length; i++)
            {
                balls[i].x += ax;
            }
        }
    }
}
于 2012-12-14T15:13:08.947 に答える
0

10 個のボールを作成するには

  1. を削除しますprivate var ball:Ball;
  2. var ball:Ball;init メソッドの for の直前に a を追加します。

そうしないと、メイン クラスに属するボールオブジェクトがループ内で 10 回更新されますが、取得できるオブジェクトは 1 つだけです。

10 個のボールのアニメーション

ボールをコンテナーに保存する必要があります。これは、クラスのいくつかの関数からアクセスするため、メインに属している必要があります。

package
{
    import flash.display.MovieClip;
    import flash.events.Event;

    public class Main extends MovieClip
    {
        private var ballsContainer:MovieClip;
        private var ax:Number;

        public function Main()
        {
            init();
        }

        private function init():void
        {
            ax = 4;

            ballsContainer = new MovieClip();
            addChild(ballsContainer);

            var ball:Ball;
            for (var i:Number = 0; i < 10; i++)
            {
                ball = new Ball();
                ball.x = Math.random() * stage.stageWidth;
                ball.y = Math.random() * stage.stageHeight;
                ballsContainer.addChild(ball);
            }

            addEventListener(Event.ENTER_FRAME, onEnterFrame1);
        }

        private function onEnterFrame1(event:Event):void
        {          
            for (var i:Number = 0; i < ballsContainer.numChildren; i++)
            {
                Ball(ballsContainer.getChildAt(i)).x += ax;
            }
        }
    }
}
于 2012-12-14T15:19:52.443 に答える
0

ボール自体の動きを処理させることができます。

package
{
  import flash.display.MovieClip;
  import flash.events.Event;
  import flash.utils.getTimer;
  public class Ball extends MovieClip {
    private var currentTime = getTimer();
    public function Ball(){
       addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }
    private function onEnterFrame1(event:Event):void {
      diff = currentTime - prevTime;
      x += diff *  ax 
      prevTime = currentTime;//update for next go around
    }
  }
}

では、なぜフレームの代わりにタイマーを使用してアニメーション化するのでしょうか? 必ずしもそうする必要はありませんが、2 つのフレームの間の時間を常に確認できるとは限りません。この場合、フレームレートは一定ではありませんが、速度は常に一定です。

于 2012-12-14T16:31:42.140 に答える