2014-04-30 58 views
0

林新動作,我一直在嘗試創建一個sidescrolling遊戲。一切都很順利,直到我意識到我需要一個功能遊戲。問題是我有許多movieclip對象與我自己的實例名稱,我從我的文檔類訪問。as3麻煩操縱文檔類以外的對象

但是,現在我有一個新的文檔類,它啓動我的舊文檔類以啓動遊戲,並在屏幕上啓動遊戲,因此我可以重置遊戲。除了現在我得到了所有50個實例對象的未定義屬性的錯誤訪問(填空)。

所以我的問題是如何讓Flash識別並允許我的非文檔類,類來操縱這些影片剪輯實例。

我創建了一個小規模的例子來說明我試圖做什麼。

package { 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.display.Stage; 
public class Test extends MovieClip { 

    public static var gstage:Stage; 

    public function Test() { 
     // constructor code 
     var playScreen:Go = new Go(); 
     addChild(playScreen); 
    } 

} 

} 

以上是我的文檔類「MoveMe的是實例

其他類這將是我的舊文檔類的名稱

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

public class Go extends MovieClip { 
    public var test:Test; 

    public function Go() 
    { 
     if (stage) 
     { 
      init(); 
     } 
     else 
     { 
     addEventListener(Event.ADDED_TO_STAGE, init); 
     } 
    } 
    private function init(e:Event = null):void 
    {  
      if (e) removeEventListener(Event.ADDED_TO_STAGE, init); 
      trace(stage.width); 
      addEventListener(Event.ENTER_FRAME, loop); 

    } 
    public function loop(e:Event, Test):void 
    { 
     Test.moveme.scaleX++ 
        Test.moveme.x++ 

    } 

} 

} 

我這一個得到的錯誤是錯誤#1063:參數計數不匹配Go/loop()。期望2,得到1.

或者如果我刪除在公共職能循環測試(e:事件,測試):void我得到相同呃像以前一樣。我已經嘗試了很多東西,我可以通過它來追蹤我無法控制實例的階段寬度。

任何幫助,將不勝感激!

回答

1

這是錯誤的,理由如下:

public function loop(e:Event, Test):void 
    { 
     Test.moveme.scaleX++ 
     Test.moveme.x++ 

    } 
  • 測試 - 是一個類的名字,如果你想它,你應該寫類似公共職能環路(E參數:事件,testObj :測試):void
  • 事件偵聽器將不會傳遞testObj。因此,如果你想使用它作爲一個事件處理程序的事件監聽器,並能夠自己調用它,你應該改變爲公共函數循環(e:Event = null,testObje:Test = null):void
    然後事件監聽器不會導致錯誤。調用由本身的函數可以這樣進行:環(NULL,yourInstanceOfTest)

此外,函數體試圖調用方法,類,而不是實例變量,它應該是:

{ 
    test.moveme.scaleX++ 
    test.moveme.x++ 

} 

就你而言,因爲test是Class的一個實例,Test是一個Class。
但是,沒有理由將Test作爲參數傳遞,只需將其刪除並僅保留e:Event部分即可。如果你想使用它,然後用傳遞的參數情況下,像這樣:

{ 
     // provided that use passed parameter type of Test as a testObj, like in my example 
     testObj.moveme.scaleX++ 
     testObj.moveme.x++ 

} 
+0

現在,如果我嘗試 公共職能環路(E:事件= NULL,testObj:測試= NULL):無效 \t \t { \t \t \t testObj.moveme.scaleX ++ \t \t} 我得到的錯誤類型錯誤:錯誤#1009:無法訪問空對象引用的屬性或方法。在Go/loop()[C:\ Users \ name \ Desktop \ games \ game3 \ Go.as:31] 行31是testObj.moveme.scaleX ++。我也使用test.moveme.scaleX ++和testObj部分從函數中取出同樣的錯誤。 – Andrew

+0

就像我說的:當事件Event.ENTER_FRAME觸發並調用循環時,它只會將「one」參數(事件本身)傳遞給函數「loop」。因此,testObj爲空,無法訪問。您可能希望將testObj聲明爲類變量並將其分配給init函數。 public class Go擴展MovieClip {private var testObj:Test;私人函數init(e:Event = null):void {testObj = new Test(); [...]公共函數循環(e:Event = null):void {testObj.moveme.scaleX ++} – Jan

0

當事件觸發Event.ENTER_FRAME並調用一個循環中,只傳遞一個參數,事件本身,到功能「循環」。然而函數「loop」需要2個參數,它們是未知類型的「e:Event」和「Test」。您可以從函數中刪除第二個參數,因爲您不在函數中使用它,或者如果您打算稍後從其他位置調用該函數並傳遞第二個參數,請將其設置爲null,以便Event.ENTER_FRAME可以正確調用它:

或者:

public function loop(e:Event):void 

或者:

public function loop(e:Event, test : Test = null):void