2010-03-17 30 views
1

我試圖做一個簡單的動畫與Flash CS4和動作腳本3.0,使一些符號從右到左不斷飛行。我想要的是,一旦符號到達屏幕的末端,它就會被銷燬,另一個符號被放置在開始位置。如何使用動作腳本3.0使隨機放置的符號飛過?

我打算給每個符號一個隨機的速度,並創建一個隨機符號,每當一個被'摧毀'。任何我可以開始的線索?

回答

1

首先,將您的符號變成影片剪輯。然後創建一個基類MySymbol.as您的符號,是這樣的:

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


    public class MySymbol extends MovieClip 
    { 
     public var speed:Number;  // Pixels moved per frame 


     public function MySymbol(speed:Number, startPosition:Point) 
     { 
      this.speed = speed; 
      this.addEventListener(Event.ENTER_FRAME, update); 

      this.x = startPosition.x; 
      this.y = startPosition.y; 
     } 


     private function update():void 
     { 
      this.x -= this.speed; 
      if (this.x < 0 - this.width) {  // We're at the left edge 
       this.removeEventListener(Event.ENTER_FRAME, update); 
       this.dispatchEvent(new Event(Event.COMPLETE)); 
      } 
     } 
    } 
} 

然後確保你的電影剪輯出口爲AS3(以下簡稱「聯動」的項目庫中的選項)。爲每個項目設置唯一的名稱(例如MySymbol1,MySymbol2),並將基類設置爲MySymbol。

您的文檔類可能是這個樣子:

package { 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import MySymbol;    // Not strictly needed 

    public class DocumentClass extends flash.display.MovieClip 
    { 
     private static var SYMBOLS:Array = new Array(MySymbol1, MySymbol2); 

     public function DocumentClass() 
     { 
      // Create five symbols: 
      for (var i:int = 0; i < 5; i++) { 
       makeSymbol(); 
      } 
     } 


     private function makeSymbol():void 
     { 
      // Pick a random symbol from the array: 
      var symType:Class = SYMBOLS[Math.random() * SYMBOLS.length]; 

      // Construct the new symbol: 
      var loc:Point = new Point(stage.stageWidth, Math.random() * stage.stageHeight); 
      var sym:MySymbol = new symType(1 + Math.random() * 30, loc); 

      // Listen for the object hitting the left edge: 
      sym.addEventListener(Event.COMPLETE, remakeObject); 
      this.addChild(sym); 
     } 


     private function remakeObject(e:Event):void 
     { 
      e.target.removeEventListener(Event.COMPLETE, remakeObject); 
      this.removeChild(e.target); 

      // Replace the dead symbol: 
      makeSymbol(); 
     } 
    } 
} 

這是很多更有效的,如果不是破壞並重新創建飛出級的對象,你重新使用現有的和移動它回到了右邊。但是如果事情變得緩慢,這是一個可以稍後實施的優化。

請注意,上面的所有代碼都是UNTESTED,而且我還沒有編碼AS3,所以它可能至少有一些bug。希望它能成爲一個足夠好的起點。

0

下面是一些提示,讓你開始。

MovieClips有一個xy屬性。如果隨着時間的推移將這些數字加起來,您會看到MovieClip沿着stage的x和/或y軸移動。看看如何使用Event.ENTER_FRAME這將允許您更改每次屏幕更新時的值。

您的stage將具有給定的寬度(一個stageWidth屬性)。您可能想要監視您的MovieClip的x屬性是否大於舞臺的寬度。如果它被刪除(removeChild)它並添加一個新的(addChild)並將其放回到開始x/y的位置。

+0

'stage.width'不能用於獲取舞臺的寬度。它存在但不用於Stage對象。改用'stage.stageWidth'。 – Cameron 2010-03-17 13:21:03

+0

我試圖將Actionscript應用到我的一個圖形符號,但它告訴我「當前選擇不能應用於它」。這是爲什麼? – 2010-03-17 13:25:39

+0

@Cameron - 公平的呼喊。修正 – 2010-03-17 13:26:51

0
  • 定義一個擴展Sprite /形狀,並具有velocity可變
  • 繪製圓(或其他)與隨機顏色
    Math.floor(Math.random() * 0xffffff)
  • 分配一個隨機值速度
    一個Circle(符號)類 minVelocity + Math.floor(Math.random() * velocityRange)
  • 創建Circle類,其登記一個輸入幀處理
  • 內部的 start()方法
  • 在輸入幀處理程序中增加this.y,如果y大於最大值,則發送'recycleMe'事件。
  • 創建N個Circle,addChild這些實例,並調用它們的start()方法。
  • 收聽'recycleMe'每個事件,並從處理程序中重置y的值。
2

當你看起來很新,以Flash作爲平臺時,我認爲編寫類不應該是學習ActionScript時的第一個端口。絕對只是玩現在的時間表,學習基礎知識。作爲非常簡單的解決方案,我建議在庫中創建一個類似'MyBall'的類名稱的MovieClip ...然後將其粘貼到主時間線et瞧的第一幀。

// Create some variables to store data 
var numberOfBalls : int = 20; 
var myBalls : Array = []; 
var xVelocities : Array = []; 

var maxXVelocitySpeed : Number = 5; 
var minXVelocitySpeed : Number = 2; 

// Add your orginal balls to the stage 
for (var i : int = 0; i < numberOfBalls; i++) 
{ 
    var myBall : MyBall = new MyBall(); 
    myBall.x = -(Math.random() * stage.stageWidth); 
    myBall.y = Math.random() * stage.stageHeight; 

    var xVelocity : Number = minXVelocitySpeed + (Math.random() * (maxXVelocitySpeed - minXVelocitySpeed)); 

    myBalls.push(myBall); 
    xVelocities.push(xVelocity); 

    addChild(myBall); 
} 

// Add a listener for enter frame events 
addEventListener(Event.ENTER_FRAME, enterFrameHandler); 


//Run this code on every frame to move the balls and reposition them if they are off the stage 
function enterFrameHandler(event : Event) : void 
{ 
    for each(var myBall : MyBall in myBalls) 
    { 
     var ballIndex : int = myBalls.indexOf(myBall); 

     myBall.x += xVelocity[ballIndex]; 

     if (myBall.x > stage.stageWidth) 
     { 
      myBall.x = -(Math.random() * stage.stageWidth); 
      myBall.y = Math.random() * stage.stageHeight; 
     } 
    } 
} 
+1

是的,比我的例子更容易理解。我認爲OP有使用其他語言課程的經驗,但這可能並非如此。 – Cameron 2010-03-17 14:53:49

+0

@Cameron - 很好。無論如何,最好在頁面上有兩個不同的有效示例;) – 2010-03-17 15:22:56