2016-06-17 12 views
-1

Ich versuche, meine erste tatsächlichen Spiel in AS3 zu machen, dafür benutze ich Flashpunk wegen seiner Einfachheit.Ändern der Welt in Flashpunk

Ich habe den Punkt erreicht, an dem ich einen beweglichen Charakter und eine Textbox habe, wenn ich vor einer Tür gehe.

Als ich infront einer Tür bin, sind zwei Variablen innerhalb der Spielerklasse geändert:

public var onDoor:Boolean = false; 
public var doorType:String = "" 

Sie können sich wahrscheinlich vorstellen, was onDoor tut, ist doorType der Name der Klasse. Es ist wie folgt eingestellt:

public static var BedroomDoor:Door = new Door(350, 331, "ApartmentBedroom") 

ApartmenBedroom ist der Name der Welt, die die Tür führt.

Im Inneren der Hauptklasse, wo flashpunk initialisiert wird, habe ich diese Funktion:

public static function ChangeLevel(world:String) 
    { 
     var newWorld = getDefinitionByName(world) as Class 
     FP.world = new newWorld 
    } 

Aber wenn ich an die Tür und drücken Sie X vor der Tür gehen, die die Funktion aufruft, habe ich immer diese Fehlermeldung:

[Fehler] Ausnahme, Information = ReferenceError: Fehler # 1065: Variable ApartmentBedroom ist nicht definiert.

Kann jemand helfen, dies zu beheben?

+0

Jedes Mal, wenn Gebrauch 'getDefinitionByName (classname)', der Klassenname den vollständigen Paketpfad enthalten sollte. 'getDefinitionByName (" com.your.domain.ApartmentBedroom ")' –

+0

so ähnlich? getDefinitionByName ("com.Worlds.ApartmentBedroom"). Ich bekomme immer noch den gleichen Fehler. Worlds ist das Paket ApartmentBedroom ist in. – Ducktor

+0

AS3 Syntax Großbuchstaben ersten Buchstaben im Paketnamen zu verbieten. –

Antwort

1

Um getDefinitionByName() zu verwenden, müssen Sie zuerst Ihre Klasse in den Code aufnehmen. Alles, was tun wird, zum Beispiel einfachen var a:ApartmentBedroom; oder komplexeres wie var allLevelsClasses:Array = [ApartmentBedroom, ApartmentLivingRoom];

So Ihres Main.as Code sollte wie folgt aussehen:

public static function ChangeLevel(world:String) 
{ 
    var allLevelsClasses:Array = [ApartmentBedroom, ApartmentLivingRoom]; // put everything here 

    var newWorld = getDefinitionByName(world) as Class 
    FP.world = new newWorld 
} 

Auch Sie könnten volle Klassennamen Verwirrung vermeiden, wenn die Tür zu schaffen. Statt Constructor-Zeichenfolge mit den Namen in Tür vorbei passiert nur Weltklasse:

private var worldClassName:String; 

public function Door(x:Number, y:Number, worldClass:Class):void 
{ 
    /// init what's necessary 
    this.worldClassName = getQualifiedClassName(worldClass); 
} 

Und später nur:

public static var BedroomDoor:Door = new Door(350, 331, ApartmentBedroom)