2012-12-14 115 views
0

我正在使用for循環將多個對象添加到舞臺上,從那裏我想製作動畫,但是當我嘗試只有一個球移動時。使用for循環動畫?

這是我的代碼。

(球從外部類拉)

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; 
     } 
    } 
} 

謝謝!

回答

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; 
      } 
     } 
    } 
} 
+0

因爲,onEnterFrame1是錯誤的命名。當給出示例代碼時,您可能會馬上修復它;) – Nallath

+0

謝謝你的工作!那麼爲什麼我們把球推入球陣列呢?是否因爲數組可以包含多個對象? – Scope

+0

你是完全正確的。 – AtomicRobot

0

要創建10個球

  1. 除去private var ball:Ball;
  2. 在init方法添加一個var ball:Ball;,所述之前中庸之道。

如果你不這樣做,對象,至極屬於主類,只是更新您的循環10次,但你仍然只有一個對象。

動畫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; 
      } 
     } 
    } 
} 
+0

如果你這樣做,你會得到錯誤,因爲你不能使用init()的局部變量到另一個方法。 – AtomicRobot

+1

在這種情況下使用MovieClip代替Array是矯枉過正的。 ;) – AtomicRobot

+0

在大多數情況下,這是過度殺傷,除非你想旋轉/翻譯/縮放一定量的所有球。那麼你可以使用movieclip – Nallath

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 
    } 
    } 
} 

那麼,爲什麼使用計時器而不是幀來動畫?那麼,你不需要,但是你不能總是確定兩幀之間的時間。在這種情況下,即使您的幀速率不是,您的速度始終保持不變。

+0

如果球的數量很大,讓每個球都有自己的ENTER_FRAME循環是一個壞主意,因爲它可能會降低性能(每幀1 vs n(球數)事件對象創建)。 – Varnius

+0

的確如此,但我不知道他究竟想幹什麼,我已經給出了一個用於遊戲的通用解決方案。 – Nallath