2013-12-16 28 views
0

我無法找到解決我的問題的具體解決方案。我開始我的文檔類「Main.as」。從那我玩框架1,這是我的GUI。在我的GUI上按下「開始」按鈕之後,我想讓它在我的Main.as中調用「Start()」函數。從階段訪問文檔類

但它只是不會工作。我發現我無法從文檔類創建對象,也不能有超過1個文檔類。那麼我能做什麼?

Main.as

import flash.events.KeyboardEvent; 
import flash.events.MouseEvent; 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.ui.Keyboard; 



public class Main extends MovieClip 
{ 
trace("Im the Main Class"); 
public var BG:MovieClip; 
public var char:Char_Control; 
public var enemy:Enemy; 
var blockSlide:Boolean = true; 
var coin_array:Array = new Array(); 
var char_array:Array = new Array(); 
var coin:item_collider; 
var posx; 
var posy; 
var oCollider; 
var main:Main = new Main(); 


    //Konstruktor 
    public function Main() 
    { 
    trace("Im the Main Class(Constructor)"); 
    this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); 
    this.stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased); 
    this.addEventListener(Event.ENTER_FRAME, Gravity); 
    this.addEventListener(Event.ENTER_FRAME,update); 
    gotoAndPlay(1); // Starts GUI 
    Start(); // Starts Everything else => The Game itself 
    } 



public function update(_event:Event) 
{ 
    //Execute Base_Class 
    //char.Move(); 

    //Execute Base_Class+Sub_Class 
    enemy.Chase(char,enemy); 
    //enemy.Move(true, "walk"); 
} 




public function Start() 
{ 
    // Adds Character to Stage 
    char = new Char_Control(875,350); 
    stage.addChild(char); 

    enemy = new Enemy(500,450); 
    stage.addChild(enemy); 

    char_array[1]=char; 
    char_array[0]=enemy; 

    // Adds Objects to Stage 
    for (var i2:int=1; i2<30; i2++) 
    { 
    posx = Math.round(Math.random()*(1400)+1); 
    posy = Math.round(Math.random()*(800)+1); 
    coin = new item_collider(posx,posy);// Öffnet Konstruktor 
    stage.addChild(coin); 
    trace("Add Coin (foreach)"); 
    coin_array.push(coin); 
    } 
} 

階段:

button.addEventListener(MouseEvent.CLICK,buttonClick); 

var tform:TextFormat = new TextFormat(); 
tform.size = 20; 
tform.font = "Arial"; 
tform.align = TextFormatAlign.CENTER; 
tform.color = 0x000000; 
tform.bold = true; 

var tfield:TextField = new TextField(); 
tfield.width = checkbox.width; 
tfield.width = button.width; 
tfield.width = coin_number.width; 
tfield.width = stepper_label.width; 
tfield.x = 0; 
tfield.y = 30; 

var coin_amount:int = 0; 
var create_enemy:Boolean = false; 

tfield.setTextFormat(tform); 
addChild(tfield); 

checkbox.setStyle("textFormat",tform); 
button.setStyle("textFormat",tform); 
coin_number.setStyle("textFormat",tform); 
stepper_label.setStyle("textFormat",tform); 





stop(); 
function buttonClick(e:MouseEvent) 
     { 
     coin_amount = coin_number.value; 
     create_enemy = checkbox.selected; 
     nextFrame(); //Next Frame => the Level itself 
    } 
+0

雖然確實只能有一個文檔類,但您絕對應該能夠實例化該類中的對象。你有什麼具體問題/錯誤?它看起來像直接在構造函數中調用'Start',而不是通過開始按鈕上的事件偵聽器。 – Marcela

+0

我想在我的舞臺的第一幀中從非extern腳本調用start()。我沒有收到錯誤,但在「gotoAndPlay(1)」之後,它會在我的舞臺上執行腳本。然後它跳到下一個Frame,我有我的背景(之前我有我的主要課程,但現在我希望它是extern)。這是我的問題。我怎麼能從我的舞臺的第二幀調用我的文檔類「Main.as」? – Fuby

+0

你真的不應該混用時間軸代碼和外部類代碼。您可以將您的任何時間軸代碼放入文檔類中。話雖如此,您的文檔類實際上是您的整個應用程序的代碼。因此,您放入文檔類的任何內容都應該可以通過時間表訪問。我認爲你的'gotoAndPlay(1)'是不必要的,你可能只想在你的第一幀的某處放置一個stop()。 – Marcela

回答

0

下載你的代碼後,我注意到有你已經設置了時間表代碼的方法和一些兼容性問題代碼旨在成爲文檔類。

儘管您在AS3.0設置中「自動聲明階段實例」未檢查,但您似乎在舞臺上混合了隱式聲明和顯式聲明實例。爲了解決這個問題,我建議不選中這個屬性並在你的Document類中聲明所有的Stage實例(這包括你在舞臺上的任何東西,例如:coin_number,checkbox等)。

這樣做還需要您導入您正在使用的任何類(即NumericStepper,TextField,TextFormat等)。

完成此操作後,您需要移動遊戲控制事件偵聽器(您在Document Class構造函數中的偵聽器)。您可以將它們放在單獨的方法中,也可以將它們添加到Start方法的末尾。如果將它們留在構造函數中,則會嘗試訪問尚未存在的內容,因爲在ENTER_FRAME上調用的方法update依賴於在Start方法中實例化的對象。

下一步是從您的構造函數調用而不是調用Start。請在第二幀上撥打電話Start

這應該使您的應用程序使用時間軸代碼和文檔類的混合運行狀態。

我想知道爲什麼這是一個好成績的要求,因爲這是非常非正統的,並且 - 大部分 - 在ActionScript社區中被忽視。

+0

非常感謝!我非常感謝您花時間仔細研究我的代碼。我會這樣做,但我認爲我現在理解我的問題。這位教授說,我們可能會跳過13個任務中的1個來獲得一個答案。也許這是因爲它不好混合這兩個,但我不確定。我還記得他告訴我們混合這兩個以獲得更好的概述。 :> – Fuby