15.5 Neue Movieclip-Klassen
Die Wahl, entweder einzelne Instanzen oder alle Movieclips mit neuer Funktionalität zu versehen, ist oft nicht ausreichend. Besser wäre es, eigene Klassen mit der geforderten Funktionalität erstellen und dann mit einer grafischen Repräsentation verbinden zu können.
Denn stellen Sie sich vor, Sie erzeugen in Anlehnung an die Kapitel »Objekterstellung« (Seite 336) und »Vererbung« (Seite 350) eine Klasse Freundin, die nicht nur abstrakt im Arbeitsspeicher liegt, sondern auch sichtbar mit einem Symbol verknüpft ist, das zum Beispiel die Funktion eines Avatars übernehmen könnte. Hier wären die bereits bekannten Wege, jeder einzelnen Instanz neue Methoden und Eigenschaften zuzuweisen, viel zu aufwändig (und würden auch zu viel Speicherplatz verschwenden) bzw. alle Movieclips zu erweitern viel zu weit reichend (warum sollte z. B. ein Mann-Symbol auch gerne einkaufen gehen).
Aber glücklicherweise können Klassen mit grafischen Symbolen zur Darstellung verbunden werden. Oder umgekehrt: Symbole dürfen Sie mit Funktionalität in Form von Klassen verknüpfen.
15.5.1 registerClass
Die Methode registerClass erlaubt es, eine Klasse mit einem Symbol für die grafische Darstellung zu verbinden bzw. ein Symbol mit der Funktionalität aus einer Klasse zu versehen.
Haben Sie beispielsweise eine Klasse mit ActionScript 1 in der folgenden Form definiert und wollen diese auch visualisieren, dann verwenden Sie diese Methode:
function Freundin() {
registerClass.fla
this.tanzwuetig = true;
}
Freundin.prototype.tanze = function() {
trace("Yippie...");
};
Um nun ein Symbol mit dieser Funktionalität zu versehen und die Klasse so mit dem Symbol zu »verschmelzen«, brauchen Sie nur das Symbol anzulegen, es über die Verknüpfungseigenschaften (engl. Linkage) mit einem eindeutigen Namen zu versehen und diesen dann per registerClass mit der Klasse zu verbinden:
Object.registerClass("FreundinSymbol", Freundin);
Eigentlich könnten Sie nun das Symbol beliebig in Ihrem Projekt verwenden, gäbe es da nicht noch drei wesentliche Probleme.
Rechtzeitige Initialisierung sicherstellen
Das erste Problem ist, dass die Registrierung immer vor der Verwendung eines Symbols geschehen sollte, um diese Verbindung zwischen Symbolinstanz und Klasse zu gewährleisten. Andernfalls erzeugen Sie einfach nur einen Movieclip mit dem Bild einer Freundin und keine neue Freundin mit der entsprechenden Funktionalität. Dieses Problem lösen Sie am einfachsten mit der Compilerdirektive initClip (siehe »Ereignisse«, Seite 282). Platzieren Sie dafür den gesamten Code eingerahmt von dem initClip innerhalb des ersten Schlüsselbildes des Symbols, da so diese Initialisierung bereits vor der ersten möglichen Verwendung des Symbols sichergestellt ist:
#initclip
function Freundin() {
this.alter = 27;
}
Freundin.prototype.tanze = function() {
trace("Yippie...");
};
Object.registerClass("FreundinSymbol", Freundin);
#endinitclip
Instanz erstellen!
Die zweite Schwierigkeit ist, wie Sie nun eine Instanz dieser Klasse Freundin erstellen. Zwar können Sie weiterhin mit dem new in der Form meineFreundin = new Freundin(); arbeiten, doch dann erhalten Sie auch weiterhin eine abstrakte Klasse ohne Bezug zu dem Symbol. Der korrekte Weg ist, dass Sie dieselben Methoden wie bei Movieclips verwenden, indem Sie eine Instanz erzeugen
|
durch Drag and Drop aus der Bibliothek in die Anwendung, |
|
durch attachMovie, |
|
oder durch duplicateMovieClip. |
Mit Hilfe des passenden Instanznamens können Sie dann die Instanz wie jedes andere Objekt ansprechen und verwenden und die definierten Methoden und Eigenschaften nutzen:
_root.attachMovie("FreundinSymbol", "meineFreundin", 1);
meineFreundin.tanze();
Movieclip-Fähigkeiten erben
Die letzte Herausforderung besteht nun darin, dass ein Symbol meist die gleiche Funktionalität wie ein Movieclip besitzen sollte, was in diesem Beispiel bisher aber nicht vollständig gegeben ist. So lässt sich eine Freundin auch nicht mehr wie üblich per meineFreundin.removeMovieClip(); loswerden. Doch sobald die Klasse auch die Eigenschaften und Fähigkeiten von der Klasse Movieclip erbt, geht auch dies:
#initclip
// Konstruktor
function Freundin() {
// Rufe Konstruktor der Oberklasse auf
super();
// Eigenschaft
this.alter = 27;
}
// Erbe von MovieClip (muss vor dem Erweitern um eigene Methoden geschehen)
Freundin.prototype = new MovieClip();
// Methoden
Freundin.prototype.tanze = function() {
trace("Yippie...");
};
Freundin.prototype.onEnterFrame = function() {
// Bewege auf und ab
this._y = Math.sin(getTimer()/500)*50+200;
};
// Verbinde Symbol und Klasse
Object.registerClass("FreundinSymbol", Freundin);
#endinitclip
Jetzt haben Sie eine eigene Klasse erstellt, die sich wie Movieclips verhält, aber durch eigene Methoden und Eigenschaften ergänzt und mit Grafik versehen werden kann. Letztendlich wird dies auch als Komponente bezeichnet, nur dass diese Komponente bisher nicht anpassbar ist.
ActionScript 2.0
Wie bereits bei dem für alle Objekte verfügbaren addProperty gibt es auch bei dem registerClass dank ActionScript 2.0 viel einfachere Wege, die zum gewünschten Ergebnis führen. Diese werden ab Seite 396 beschrieben.
|