2009-07-26 8 views
1

Wie greife ich auf Stage Class-Eigenschaften in der Costum-Klasse zu?ActionScript 3.0 stageWidth in benutzerdefinierter Klasse

Klasse:

package { 
    import Main; 
    import flash.events.*; 
    import flash.display.Sprite; 
    import flash.display.Stage; 

    public class Run extends Sprite { 
     var obj:a1_spr; 


     public function Run() { 
      runAssets(); 

     } 



     private function runAssets():void { 
      obj = new a1_spr() 
      addChild(obj); 
      obj.x = stage.stageWidth/2; 

     } 
    } 
} 

Ausgang:

TypeError: Error #1009: Cannot access a property or method of a null object reference. 

Antwort

2
this.addEventListener(Event.ADDED_TO_STAGE, handleAdedToStage) 

private function handleAddedToStage(event:Event):void 
{ 
    this.runAssets() 
} 

private function runAssets():void 
{ 
    obj = new a1_spr(); 
    addChild(obj); 
    obj.x = this.stage.stageWidth/2; 
} 

Du wirst keinen Zugriff auf die Bühne im Konstruktor (wenn Sie die Bühne injizieren in die Klasse). Sprite hat eine Bühneneigenschaft.

+0

Tank Sie. Es klappt. Aber ich bin mir nicht sicher, warum ich das verstehe. Kannst du mir bitte erklären, warum ich es mit Zuhörer laufen lassen muss? –

+0

Die Bühne Eigenschaft aller Displayobjects ist null, bis sie auf der Anzeigeliste hinzugefügt werden, so dass Sie, bevor Sie es in die Aufgabe ist sicherzustellen, müssen zuzugreifen;) – Cay

+0

Wenn Sie Ihr Objekt mit var myObject instanziiert: MyObject = new MyObject() Der Konstruktor wird sofort ausgeführt, einschließlich aller Methoden, die Sie auch innerhalb des Konstruktors aufrufen. Auch wenn die nächste Zeile nach dem neuen MyObject addChild (myObject) ist, befindet sich das myObject nicht auf der Bühne oder hat Bezug auf die Bühne. Sie könnten auch Bühne: Stage ein Konstruktorargument von MyObject, also neues myObject (this.stage), und Sie hätten sofortigen Zugriff auf die Stufe der Anwendung. –

3

zu erweitern, was Joel sagte, und es in einen Kontext setzen:

Jedes Anzeigeobjekt eine .stage Eigenschaft hat, aber das Eigentum ist null, bis Sie Objekt auf der Anzeigeliste Anzeige hinzuzufügen. Während der Erstellung werden Sie nie darauf zugreifen können (weil es danach hinzugefügt wird)

Das Ereignis ADDED_TO_STAGE wird ausgelöst, wenn Sie Ihr Objekt zur Bühne hinzufügen, so dass Sie wissen, dass die .stage -Eigenschaft nun gefüllt ist. Danach können Sie von überall in Ihrem Objekt auf die Bühne zugreifen.

Hoffnung, dass die Dinge für Sie verdeutlicht.

0

wenn Flash die FLA-Assets mit Ihrer .as-Dateien kompiliert, gibt es keine Bühne. Also wird der Code als Vorbereitung für Ihre Dokumentklasse initiiert, Sie müssen sich anhören, wenn es eine Bühne gibt, damit sie gerendert werden kann.

Deshalb sollten Sie auf ADDED_TO_STAGE hören, zu überprüfen, es ist eigentlich in der Anzeigeliste.

Dieses Problem tritt für alle Anzeigeobjekte, da sie auf die Anzeigeliste hinzugefügt werden muss, wenn es eine tatsächliche Bühne ist.

gewöhnen, dass Zuhörer hinzuzufügen, und für eine Bühne zu überprüfen. speziell wenn Sie in einem Team arbeiten und Ihre eigenen Komponenten in einem größeren Projekt machen.

Verwandte Themen