0

我是新來的這個面向對象的東西,我很難理解所有這一切。使用實例已經從另一個階段

我想在AS3.0中用類創建一個簡單的whack-a-mole遊戲,我使用時間線編碼在AS2.0中創建了這個遊戲。

我已經閱讀了很多論壇,但我仍然不明白我究竟做了什麼錯。

我的繼承人設置:

  1. 我有一個影片剪輯命名爲mrBunny(我女朋友告訴我,將其更改爲小兔子痣太醜陋)。現在舞臺上有mrBunny 6個實例,每個實例名爲mrBunny0-5
  2. mrBunny符號鏈接到com.mrBunny類。
  3. 該課程有一個名爲randomPlay();的方法,我用它來隨機化mrBunny的動畫時間。
  4. 我還在舞臺上有一個按鈕stageBtn

包COM {

import flash.display.SimpleButton; 
import flash.display.MovieClip; 
import flash.display.Stage; 
import flash.events.MouseEvent; 

public class startBtn extends SimpleButton { 

    //Constructor 
    public function startBtn() { 
     this.addEventListener(MouseEvent.CLICK, startClick); 
    } 

    public function startClick(event:MouseEvent):void { 

     mrBunny0.randomPlay(); 
     mrBunny1.randomPlay(); 
     mrBunny2.randomPlay(); 
     mrBunny3.randomPlay(); 
     mrBunny4.randomPlay(); 
     mrBunny5.randomPlay(); 

    } 
} 

}

我希望能夠使用startBtn啓動mrBunny#實例的動畫。

據我所知,我並沒有完全掌握類和OOP的情況。

+0

你得到的結果是什麼當你點擊startBtn時? – 2011-02-23 04:09:53

+0

1120:訪問未定義的屬性mrBunny0。來源:mrBunny0.randomPlay();當我編譯.fla – joemidi 2011-02-23 11:34:39

回答

2

(兔子只是太可愛了通過關於這個問題,所以這裏去...)

有幾個問題區域在約OOP代碼來考慮。我會盡量解釋一下。

軟件包名稱:

包名,以便唯一標識一類給出。考慮一下使用第三方庫的情況,該庫有一個StringUtils類。你也碰巧有一個StringUtils類。你如何將它們存儲在工作文件夾中?你如何在你的代碼中解決它們中的每一個?

顧名思義,包提供了一種機制來對類進行分組。所以,當你提到你的班級時,你可能會將其作爲com.joemidi.utils.StringUtils,另一個作爲com.someoneelse.utils.StringUtils。包名稱可以是任何你喜歡的,只要它反映文件夾結構。但是,作爲一個行業標準,人們在包名中使用URL,因爲它們保證是唯一的。這就是你在許多軟件包中看到com的原因。在你的情況下,最好是根據這個重構你的包(和文件夾結構)。從IDE

階段實例:

當您創建在Flash IDE的情況下,你必須記住,你把它們和你的代碼是否知道它們。 @weltraumpirat說,兔子不是裏面的你的startBtn。做你正在嘗試做正確的方法是這樣的:

Main: 
    + contains the bunnies. 
    + listens to startButton for MouseEvent.CLICK 
    + when startButton is clicked, manipulates the bunnies. 

這就是說,我們知道有一個問題:

不要在實例名依靠:

你應該在代碼中實例化(即創建新的)bunnies,而不是在Flash IDE中;並從一箇中央變量訪問它們。例如:

public class Main extends MovieClip { 

    var bunnies:Array = new Array(); 

    public function Main() { 
     createBunnies(7); 
     startButton.addEventListener(MouseEvent.CLICK, onStartClicked) 
    } 

    protected function createBunnies(bunnyCount:int):void { 
     for (var i:int = 0; i < bunnyCount; i++) { 
      var bunny:Bunny = new Bunny(); 
      addChild(bunny); 
      // configure bunny.x, bunny.y, etc. here. 
      bunnies.push(bunny); 
     }; 
    } 

    protected function onStartClicked(e:MouseEvent) { 
     for (var i:int = 0; i < bunnies.length; i++) { 
      var bunny:Bunny = bunnies[i]; 
      bunnies.randomPlay(); 
     }; 
    } 

在這裏,您不再受限於您給兔子的實例名稱。 (當然,我只是假設你的舞臺結構在這裏。)這樣,兔子就更加「獨立於」它們之上的代碼。此外,您可以使用持有者精靈並從那裏追蹤兔子,但現在它可能會有點進步。

希望這些可能對您有用。如果你對這個主題很認真,你可能想了解更多關於面向對象的知識,特別是爲什麼需要它,以及關於它的關鍵術語:解耦,繼承,封裝等。

+0

感謝球員們的回覆,這非常有見地,但我一直很忙,我沒有機會實施它。 =(該死的自由職業者。 – joemidi 2011-02-25 01:30:55

0

startBtn沒有成員mrBunny0-5,主時間軸。改爲嘗試root.mrBunny0

+0

時,我得到了這個結果。 '1119:通過靜態類型的引用訪問可能未定義的屬性mrBunny0 flash.display:DisplayObject.'我知道'startBtn'沒有這些成員,但是如何讓它知道它們在時間線上? – joemidi 2011-02-23 12:36:57

+0

指定一個文檔類,例如:'WhackABunny'。你可以寫一個(你必須確保所有的舞臺元素都聲明爲成員變量),或者只是分配一個名稱,讓Flash創建它。然後在引用其成員時鍵入cast到此文檔類:'WhackABunny(root).mrBunny0' – weltraumpirat 2011-02-23 13:00:39

+0

或將類型強制轉換爲MovieClip:'MovieClip(root).mrBunny0'。 MovieClip是動態的,所以你不應該得到一個錯誤。或者使用'root.getChildByName(「mrBunny0」)',然後輸入cast到'MrBunny'。順便說一句,所有的類名都應該以大寫字母開頭。 – weltraumpirat 2011-02-23 13:03:21

相關問題