2013-01-02 66 views
1

我使用ActionScript 3,我最近實施了新的,非常小的預加載器來代替,我用的是佔位符製作一個簡單的遊戲中的Adobe Flash CS4。但是,一旦我做到了這一點,我似乎打破了一切。的ActionScript 3:影片剪輯添加到舞臺沒有出現或工作

第一幀在「動作」中只有stop();,然後是一個DocumentClass外部類文件(我所有的類都是外部的),它們設置了預加載器,它在它自己的類文件中。預加載器完成後,會將事件觸發到運行gotoAndStop(3);的DocumentClass。在幻燈片3上是一個名爲Main的影片剪輯,它具有自己的類文件。

主要進口一堆東西,然後加載遊戲的開幕畫面。此時一切都基本崩潰了。任何嘗試修改此開幕屏幕上的東西(同時包含類文件和MovieClip對象)都會導致「TypeError:錯誤#1009:無法訪問空對象引用的屬性或方法」。我認爲這段代碼可能在MovieClip處於舞臺之前運行,因此我添加了addEventListener(Event.ADDED_TO_STAGE, onAddtoStage);並將代碼移至onAddtoStage函數;而這樣做trace("this is the stage: "+stage);trace("this is my parent: "+this.parent);將返回正確的,非空值,我還是不能做任何修改(例如,製作一個MovieClip對象我想隱藏通過設置invisibleBG.alpha = 0;無形仍返回錯誤#1009)。

此外,儘管舞臺上可以看到MovieClip,但MovieClip的開幕畫面不顯示。我不知道這是否是背後主要對象莫名其妙,但似乎它根本就沒有在舞臺上的。

有下面一些我的代碼。如果這不能說明問題所在,我可以添加更多內容。我一直在爲此撓頭,當然,我花了兩天的時間才弄清楚我無法修改TextField,因爲它延伸到兩幀以上,所以可能有一個非常簡單的解決方案。在此先感謝您的幫助!

這裏的大部分處理初始加載類:

public class DocumentClass extends MovieClip 
{ 
    public var loadingScreen:LoadingScreen; 

    public function DocumentClass() 
    { 
     loadingScreen = new LoadingScreen(); 
     addChild(loadingScreen); 

     stage.stageFocusRect = false; 

     loadingScreen.addEventListener(Event.COMPLETE, onPreloaderComplete); 
     loadingScreen.setLoaderInfo(loaderInfo); 
    } 

    public function onPreloaderComplete(e:Event):void 
    { 
     loadingScreen.removeEventListener(Event.COMPLETE, onPreloaderComplete); 
     removeChild(loadingScreen); 
     loadingScreen = null; 

     gotoAndStop(3); 
    } 
} 

這裏的主要類的相關部分:DesktopScreen,

public class Main extends MovieClip 
{ 
    public function Main() 
    { 
     showDesktop(); 
    } 
    public function showDesktop():void 
    { 
     desktopScreen = new DesktopScreen(); 
     addChild(desktopScreen); 

     stage.focus = desktopScreen; 
    } 
} 

相關部分的遊戲的開始屏幕:

public class DesktopScreen extends MovieClip 
{ 
    public function DesktopScreen() 
    { 
     addEventListener(Event.ADDED_TO_STAGE, onAddtoStage); 
    } 

    public function onAddtoStage(e:Event):void 
    { 
     Mouse.show(); 

     invisibleBG.alpha = 0; 
     fakeButton.stop(); 

     time = new Time; 
     time.x = 504; 
     time.y = 3; 
     addChild(time); 
    } 
} 

TL; DR我正在添加一個MovieClip到舞臺上,即使我可以通過trace來判斷它認爲它在舞臺上的功能,但是我無法以某種方式查看它或修改它的任何內容這將需要它實際上在舞臺上。

+0

您是在舞臺時間線的幻燈片3上還是在'DocumentClass'的幻燈片3上放置了'Main'? – Foggzie

+0

@gunther'Ma​​in'位於舞臺時間軸的第3張幻燈片上。出現「Main」(MovieClip只包含背景)並運行代碼,但DesktopScreen運行代碼但不顯示。希望有助於清理事情。 –

回答

0

好吧,我設法今天這個來修復。這是發生了什麼事。

當我實現我的新預加載器時,我試圖使用詳細的here三幀方法。順便說一下,如果你正在尋找一個預加載器,這是一個很好的通用教程。

不過,我想在本教程的後面上使用的四格的方法,但我錯過了一個重要的事實:直到它到達,他們是在框架Flash無法訪問的資產。所以,第1幀只有我的預加載器(和非常小的DocumentClass),第2幀是我的類框架,第3幀有Main對象及其相關代碼,第4幀有我的AssetHolder對象以及我所有的庫對象。

結果是,當我跑gotoAndStop(3);,主類和對象都是可用的,這叫做DesktopScreen類和對象。但只有DesktopScreen 是可利用的(因爲它是在幀2)和對象不是(這將無法使用,直到幀4)。結果是代碼已經運行,但是由於舞臺上沒有任何東西(儘管Flash告訴我這是事實),它拋出了一堆錯誤。

我終於想通了這一點,當我回顧邁克爾·詹姆斯·威廉斯here極爲翔實的教程。這是另一個很好的教程來檢查,如果你想開始使用Flash!

所以,這是很容易解決;停止對我的資產使用(不必要的)框架4,然後將它們移動到框架2.框架1在動作面板中仍然有stop();,因此遊戲在開始加載時立即停止,查找DocumentClass,開始預加載,然後一旦加載,就進入第3幀(所有資產和類都可用)。

我希望這有助於人誰也有類似的,令人難以置信的晦澀難懂,問題。如果你有任何問題隨時問!

+0

另外,我最終將AssetHolder移動到了第3幀,將第2幀留空,並將Main移動到第4幀。這減少了在預加載器之前必須加載的文件的數量,因爲Flash在一幀之前加載了一些內容(I認爲)。不幸的是,這使得我每次播放文件時都會聽到一個聲音,我不知道爲什麼。 –

+0

我能夠通過刪除它並以不同的名稱重新添加到庫中來讓聲音停止播放。不知道爲什麼。 –

相關問題