MovieClip Subklasse dynamisch instanzieren
12. March 2009, 17:51 UhrWer häufig mit ActionScript 2 zu tun hat, wird sicher früher oder später auf die Idee kommen, dass es ja ganz sinnvoll wäre, eigene Subklassen von MovieClip zu haben.
Das Problem ist: Wie kann man solche Subklassen dynamisch instanzieren und der Bühne hinzufügen?
In ActionScript 3 gibt es ja glücklicherweise die Funktion addChild( DisplayObject ), in ActionScript 2 wird man diese oder eine vergleichbare Funktion leider vergeblich suchen.
Allerdings gibt es (mindestens) zwei Möglichkeiten, doch zum Ziel zu kommen.
Möglichkeit 1:
Diese Möglichkeit ist hier sehr nett und ausführlich beschrieben, gefällt mir persönlich allerdings nicht, da es zuviel mit der Flash IDE zu tun hat und recht statisch ist.
Möglichkeit 2:
Dank an Luke für die folgende Methode, die hier auf englisch zu finden ist.
Anstatt direkt MovieClip zu extenden, sollte die neue Klasse von der folgenden erben (bei mir heißt sie DynamicMovieClip, bei Luke View):
DynamicMovieClip.as:
import mx.events.EventDispatcher;
class de.onlinekat.common.DynamicMovieClip extends MovieClip
{
private static var _symbolClass : Function = DynamicMovieClip;
private static var _symbolPackage : String = "__Packages.de.onlinekat.common.DynamicMovieClip";
public var dispatchEvent : Function;
public var addEventListener : Function;
public var removeEventListener : Function;
private function DynamicMovieClip()
{
super();
EventDispatcher.initialize( this );
onEnterFrame = __$_init;
}
private function onInitialize() : Void
{
// called on the first frame. Event dispatchers are
// ready and initialized at this point.
}
private function __$_init() : Void
{
delete onEnterFrame;
onInitialize();
}
private static function createInstance(symbolClass, parent : MovieClip, instance : String, depth : Number, init : Object) : MovieClip
{
if( symbolClass._symbolPackage.indexOf("__Packages") >= 0 )
{
Object.registerClass(symbolClass._symbolPackage, symbolClass);
}
if( depth == undefined )
{
depth = parent.getNextHighestDepth();
}
if( instance == undefined )
{
instance = "__$_" + depth;
}
return( parent.attachMovie(symbolClass._symbolPackage, instance, depth, init) );
}
public static function create(parent : MovieClip, instance : String, depth : Number, init : Object) : DynamicMovieClip
{
return( DynamicMovieClip( createInstance(_symbolClass, parent, instance, depth, init) ) );
}
}
Nun kann man seine Subklasse von DynamicMovieClip ableiten und muss lediglich die create-Funktion implementieren:
SubClass.as
import de.onlinekat.common.DynamicMovieClip;
class SubClass extends DynamicMovieClip
{
private static var _symbolClass : Function = SubClass;
private static var _symbolPackage : String = "__Packages.SubClass";
public var _someVar : String;
private function SubClass()
{
// constructor private
}
private function onInitialize() : Void
{
// implement this to add listeners etc.
}
public static function create(parent : MovieClip, instance : String, depth : Number, init : Object) : SubClass
{
return( SubClass( createInstance(_symbolClass, parent, instance, depth, init) ) );
}
}
Nun kann ich meine Subklasse ganz locker zur Laufzeit instanzieren:
var subclass : SubClass = SubClass.create( this );
Initialisierungsparamter kann man dabei als 4. Argument des create-Aufrufs als Objekt mitgeben.
Achtung: Leider bekommt der Konstruktor keine Argumente übergeben, man kann allerdings Variablen einen Wert zuweisen, sofern diese public deklariert sind.
var subclass : SubClass = SubClass.create( this, undefined, undefined, { _someVar: "SomeValue" } );
Ich hoffe, es hilft dem einen oder anderen weiter.