2011-03-16 162 views
1

我有在AS3文件這和舞臺在AS3

區分這時候有點混亂可以說,我有一個鏈接到一個Main.as

一個主舞臺,然後什麼

之間的differenence

this.addChild()
stage.addChild()

還什麼類型的對象是 「本」

可以說我創建一個類,並通過在「當前」,所以我可以指從MC內部到階段

變種MC一個實例:DERP =新DERP(本)

裏面的derp是什麼?它是類型的通用對象嗎?

回答

9

類的內部成員this引用當前實例的成員函數被調用(所以它總是與類相同的類型)。例如,如果你有一個類鼻音與成員函數func

var twang1:Twang = new Twang(); 
twang1.func();  // Inside func(), "this" will refer to twang1 

閃存首先創建在其上的一切必須被放置(直接或間接)(類型Stage的)階段。然後,它實例化你的文檔類的一個實例,並把它放在舞臺上作爲一個孩子。因此,您的代碼中的this永遠不會指向舞臺,因爲您沒有編寫Stage類。

由於顯示樹在Flash中是分層結構的,因此當您向舞臺上已有的子對象(至少間接)添加內容時,它將出現在屏幕上。因此,this.addChild()stage.addChild()之間的區別是對象最終將插入哪個容器。

當將this傳遞給另一個對象的構造函數時,它將是定義方法(使用this)的類的類型;所以在這種情況下,它將是文檔類的類型。

不是傳遞的顯示對象容器的其他對象,以便爲他們的孩子加入到它,你可以有你的類從雪碧(或其他一些DisplayObjectContainer)繼承並添加子自己。然後,您可以將您創建的對象(其中包含子對象)添加到您自己(文檔類實例)中,該對象位於舞臺上。這也提供了更好的封裝。

還要注意的是,如果您想直接將孩子添加到舞臺上,則無需將舞臺傳遞給這些對象;他們已經有一個stage財產只是爲了這個目的。關於該屬性的唯一棘手的事情是,直到該對象實際添加到舞臺上才爲空;所以,你需要一個事件偵聽器:

public class Car : Sprite { 
    public Car() { 
     this.addChild(new Wheel()); // Add to self 

     this.addEventListener(event.ADDED_TO_STAGE, populateStage); 
    } 

    private function populateStage():void { 
     stage.addChild(new RandomThingToAddToStage()); 
    } 
} 

最後要注意,你不需要指定在大多數情況下this。以下兩行是相同的(在一個類的方法中):

addChild(foo); 
this.addChild(foo); 
+0

好吧,讓我直接得到這個: – Saad 2011-03-17 04:58:49

+0

@Saad:是嗎? (我寫這個答案,而睡眠剝奪BTW,所以一些地方可能不太清楚) – Cameron 2011-03-17 05:02:54

+0

@Cameron OK,讓我得到這個直:首先 我們 主要>>階段(隱含的) 那麼如果我們去 foo = new Foo() adChild(foo); 我們 主要>> >>舞臺富 和內部FOO我有 foobar的=新FooBar的() 的addChild(foobar的); 我們有 主>>舞臺>> foo >> foobar 但是如果我想在舞臺下添加foobar,基本上我們的main.as但是在foobar裏面(我不需要將這個實例傳入foo叫它x,然後去:x.addChild(foobar)? – Saad 2011-03-17 05:10:20

2

下面是文檔類的例子:使用上面的例子

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite 
    { 
     public function Main() 
     { 
      this.addChild(new Sprite()); 

      addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 

     }// end function 

     public function onAddedToStage(e:Event):void 
     { 
      stage.addChild(new Sprite()); 

     }// end function 

    }// end class 

}// end package 

,所述this關鍵字指向當前實例,在此,這將是該Main顯示對象(沒有雙關語意)的情況下。當您對此調用addChild()方法時,您正在調用Main顯示對象上的addChild()方法。此時,添加新的Sprite實例時,將其添加到Main顯示對象或換句話說this顯示對象。

stage另一方面是Main的公共財產,它存儲對舞臺的引用。當您使用舞臺參考的addChild()方法添加Sprite的新實例時,將該實例添加到舞臺而不是Main顯示對象。

簡單地說就是Main是舞臺的小孩展示對象。所以當你做stage.addChild(new Sprite())時,舞臺現在有兩個子對象,新的Sprite實例和Main。但是,當您從Main類中執行this.addChild(new Sprite())時,您指的是Main。所以現在舞臺有一個子顯示對象Main,而Main具有Sprite的新實例作爲子顯示對象。

+0

do main和stage是否共享相同的直角座標? stage.MC.x == Main.Mc.x – Saad 2011-03-16 05:31:59

+0

不,至少我不這麼認爲,那真是另一個問題。你從我的回答中得到了'this'和'stage'之間的區別嗎? – Taurayi 2011-03-16 05:51:04

+0

+1,這真的強調階段和文檔類之間的區別 – Cameron 2011-03-17 05:34:21