2012-03-10 91 views
0

我創建了一個自定義類(.as在下面:)。它存在於我的主要時間線中的三個實例(panel1,panel2和panel3),目前只有一個關鍵幀。爲什麼自定義類的構造函數被多次調用?

當我調試我的文件時,在第1幀中爲每個實例調用構造函數。涼。然而,稍後的構造函數被稱爲每個實例AGAIN,消除我所做的任何更改。

將實例從庫中拖放到舞臺上。還有我的文字中沒有「=新Scorepanel()線。

什麼觸發此,我該如何預防呢?

--Ken(難以置信的沮喪)富蘭克林

{

import flash.display.MovieClip; 
import fl.text.TLFTextField; 

public class scoreunit extends MovieClip 
{ 
    private var team:String = "WHOAMI"; 
    private var points:Number = 0; 
    private var scorevalue:String; 
    private var teamname:String; 
    private var inited:Boolean = false; 

    function scoreunit() 
    { 
     if (! inited) 
     { 
      this.teamname = team; 
      this.scorevalue = String(points); 
      var teamnamebox=new TLFTextField(); 
      teamnamebox.x = 2.25; 
      teamnamebox.y = 295.25; 
      teamnamebox.width = 295.25; 
      teamnamebox.height = 70; 
      teamnamebox.text = team; 
      var scorevaluebox=new TLFTextField(); 
      scorevaluebox.x = 2.25; 
      scorevaluebox.y = 95.80; 
      scorevaluebox.width = 295; 
      scorevaluebox.height = 97.5; 
      scorevaluebox.text = scorevalue; 
      trace("I set the starting values"); 
      trace("teamnamebox = ",teamnamebox.text); 
      trace("scorevalue = ",scorevaluebox.text); 
      inited = true; 
     } 
    } 

    public function score():Number 
    { 
     return points; 
    } 

    public function winpoints(n:Number) 
    { 
     points += n; 
     scorevalue = String(points); 
     scorevaluebox.text = scorevalue; 
    } 

    public function losepoints(n:Number) 
    { 
     points -= n; 
     scorevalue = String(points); 
     scorevaluebox.text = scorevalue; 
    } 

    public function setname(s:String) 
    { 
     team = s; 
     teamname = team; 
     teamnamebox.text = s; 
     trace("I changed the name to ",teamnamebox.text); 
    } 

    public function buzzin() 
    { 
     this.gotoAndStop("buzzedin"); 
    } 

    public function makeddselect() 
    { 
     this.gotoAndStop("ddtarget"); 
    } 

    public function makeyay(y:Number) 
    { 
     switch (y) 
     { 
      case 1 : 
       this.gotoAndStop("yay1"); 
       break; 
      case 2 : 
       this.gotoAndStop("yay2"); 
       break; 
      case 3 : 
       this.gotoAndStop("yay3"); 
       break; 
      case 4 : 
       this.gotoAndStop("yay4"); 
       break; 
      case 5 : 
       this.gotoAndStop("yay5"); 
       break; 
      case 6 : 
       this.gotoAndStop("yay6"); 
       break; 
      default : 
       trace("CRASH! "+y+" IS NOT A VALID YAY!"); 
     } 
    } 

    public function makeboo(b:Number) 
    { 
     switch (b) 
     { 
      case 1 : 
       this.gotoAndStop("boo1"); 
       break; 
      case 2 : 
       this.gotoAndStop("boo2"); 
       break; 
      case 3 : 
       this.gotoAndStop("boo3"); 
       break; 
      case 4 : 
       this.gotoAndStop("boo4"); 
       break; 
      case 5 : 
       this.gotoAndStop("boo5"); 
       break; 
      case 6 : 
       this.gotoAndStop("boo6"); 
       break; 
      default : 
       trace("CRASH! "+b+" IS NOT A VALID BOO!"); 
     } 
    } 

    public function makescrewing() 
    { 
     this.gotoAndStop("evilface"); 
    } 

    public function makescrewed() 
    { 
     this.gotoAndStop("screwed"); 
    } 

    public function makesplat() 
    { 
     this.gotoAndStop("eekface"); 
    } 

    public function makefreeze() 
    { 
     this.gotoAndStop("frozen"); 
    } 

    public function makehome() 
    { 
     this.gotoAndStop("inactive"); 
    } 

} 

}

+0

使用它來調試:'var s:String =''; var mc = this;做{s + = mc.toString(); mc = mc.parent; } while(mc!= null);痕跡; ' – scibuff 2012-03-10 16:05:04

+0

我在開始時收到了三次:[object scoreunit] [object MainTimeline]。 20幀之後我收到了三次:[object scoreunit] [對象MainTimeline] [object Stage] – 2012-03-10 16:20:23

+0

那是在我給舞臺添加了一個鍵盤監聽器之後。嗯。 – 2012-03-10 16:22:43

回答

0

您在這裏遇到的問題不是來自您的代碼,而是來自時間線。您班級的代碼只能訪問當前顯示的元素框架和對其他實例,符號以及當前框架之外的任何東西的鬆散訪問。

你的問題是Flash第一次遍歷每一幀,在調試中突出顯示每個對象都被正確構建,但一旦它到達時間線上的最後一幀,它就回到第一幀,執行因爲任何出現在畫面上的物體都會再次重新出現。

您需要避免將類實例手動放置在舞臺上。

此外,這是個人實踐,如果您需要使用框架和代碼,更喜歡使用單幀剪輯,並使用代碼中的addChild()圖標庫,資產和gotoAndStop()。你最終會擁有更多的控制權,並且會減少挫折感。但總的來說,如果你正在編碼,儘可能避免使用幀;)

希望這有助於!

+0

唉,所有這些都可以在Actionscript 2.0中無縫運行,但是顯然Actionscript 3.0希望我們能夠取消它。這教給我的是,我剛剛停止在Flash中寫作,現在將找到一種方式來產生這種方式。 --- Ken(欣賞反饋)Franklin – 2012-03-10 17:11:57

+0

@KenFranklin我認爲你可以通過將你的樂譜數據保存在一個靜態類中,並根據靜態樂譜數據填充動畫片段的值來輕鬆解決問題。無論您使用什麼工具或平臺,都會出現這些類型的問題,而且我不知道這種工具與您希望創建的工作類型的Flash具有相同的可視性。你可以尋找一種新的工具,但除非你自己學習處理這些類型的數據管理問題,否則你將受制於你的工具製造者的擺佈,隨着舊工具的死亡或退出,贊成 – scriptocalypse 2012-03-10 20:21:45

+0

@Scriptocalypse - 我同意,如果這是唯一的問題,但從美麗到破碎的其他問題的數量遠遠大於這個問題。在我煨下來之後,我將再次嘗試使用AS 2.0進行重寫...我知道這符合我的需求。謝謝 :) – 2012-03-11 00:10:41

相關問題