2010-08-16 30 views
1

我有兩個類。 Main類調用一個函數,該函數在第二個類中定義。我收到以下錯誤: 錯誤1120:訪問未定義的屬性myFunctionAS 3.0:從Main類中調用另一個類中定義的方法給出錯誤1120

基本上,我在Main類中創建按鈕,將相應的子項添加到第二個類中的對象(如果您單擊一個按鈕,孩子x1將被添加,如果你點擊另一個按鈕,孩子x2將被添加,等等)。

下面是對文件Main.as相關代碼:

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.events.MouseEvent;   
    public class Main extends MovieClip { 
     private var x1:X1 = new X1(); 
     private var x2:X2 = new X2(); 

     public function Main():void { 
      addPlayers();   
     } 

     public function addPlayers():void { 
      addChild(x1); 
      addChild(x2); 
      x1.x=325; 
      x1.y=5; 
      x2.x=366; 
      x2.y=5; 

      x1.label = "dog"; 
      x2.label = "cat"; 

      x1.addEventListener(MouseEvent.CLICK, selectPlayer); 
      x2.addEventListener(MouseEvent.CLICK, selectPlayer); 
     }  
    } 
} 

的Second.as文件代碼:

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

    public class Second extends MovieClip 
    { 
     public var myVar:MyVar = new MyVar(); 

     public function Second():void 
     { 
      addChild(myVar);       
     } 

     private var mc_x1:Mc_x1 = new Mc_x1(); 
     private var mc_x2:Mc_x2 = new Mc_x2();  

     public function selectPlayer(event:MouseEvent):void 
     { 
      if (Game(this.parent).turn == 0) { 
       myVar.addChild(mc_x1); 
      } else {   
      switch (event.currentTarget.label) { 
      case "dog": 
      myVar.addChild(mc_x1); 
      break; 
      case "cat": 
      myVar.addChild(mc_x2); 
      break; 
      default: 
      myVar.addChild(mc_x1); 
      } 
      } 
     } 
    } 
} 

我試過定義一個新的變量作爲公共靜態無功並沒有奏效。我也嘗試在Main類中導入第二個類,但也沒有工作。有什麼想法嗎? 謝謝!

回答

2

如果我理解你的代碼所說的話,你不能做你自己的事情。即使您正在聽X1和X2上的事件,您也正在從主聽他們。換句話說,main正在嘗試處理事件,並且它沒有找到您指定的函數(selectPlayer)。如果你想要所有的事件處理髮生在main中,那麼main在接收事件時必須調用X1和X2。

+0

嗨ThatSteveGuy, 感謝您的回覆!我不明白你的意思是什麼「,那麼當它收到一個事件時,main將不得不調用x1和x2。」你能澄清一下嗎?謝謝! – julie2010 2010-08-16 14:31:00

+0

實際上有很多方法可以完成你正在嘗試做的事情,而且我不確定我是否正確地閱讀了你的代碼,但是一種方法是讓eventHandler(selectPlayer)在main中,並且使用一個公共函數你的玩家類(Second)叫做setAnimal。你在main中的事件處理器會做如下的事情:(event.currentTarget as [YourPlayerClassName])。setAnimal(); setAnimal可以在需要的時候接受一個參數,它指定了新的動物。您可能想聽取第二個事件作爲替代(如widged建議)。 – ThatSteveGuy 2010-08-16 15:42:52

0

試試這個

public function Second():void 
{ 
      this.addEventListener(MouseEvent.CLICK, selectPlayer); 
      addChild(myVar);       
} 

(不要忘記從主刪除x1.addEventListener,x2.addEventListener)

2

我ThatSteveGuy同意,在主你撥打的沒有按」功能存在,即selectPlayer()。遵循你的代碼,你應該做的第一件事是在Main中添加一個selectPlayer()函數。

然後,你需要爲了加入主第二類的實例以下工作

private function selectPlayer(event:MouseEvent):void 
{ 
    second.selectPlayer(event); 
} 

現在是有點困難,任何進一步的勸你,因爲這樣做,讓看起來有點令人費解,但後來我需要看到大局。這只是對你的代碼不起作用的解釋。此外,在第二類中,selectPlayer可能會拋出錯誤,因爲Game(this.parent)將返回空值,因此您將無法訪問turn屬性...

是否有充分的理由說明爲什麼您需要在Main中添加兩個按鈕,而不是在Second中添加它們?

相關問題