15.3 Selbst definierte Eigenschaften und Fähigkeiten
Da die Fähigkeiten und Eigenschaften eines Movieclips nicht immer ausreichen, bietet ActionScript auch die Möglichkeit, neue hinzuzufügen.
15.3.1 Eigenschaften einer Instanz hinzufügen
Der einfachste Weg zu neuen Eigenschaften ist die konventionelle Definition von Variablen. Diese Variablen sind bezüglich einer Movieclip-Instanz nichts anderes als Eigenschaften – manchmal auch Instanzvariablen genannt!
Angenommen Sie programmieren Pokémon-Karten mit Hilfe von Movieclips (für die älteren unter Ihnen geht das auch mit einem Quartettspiel wie zum Beispiel »Die schnellsten Autos«). Jede dieser Karten beinhaltet eine Reihe von zusätzlichen Eigenschaften wie Typ, Größe und Gewicht, die Movieclips nicht von Natur aus besitzen. Für einzelne Instanzen definieren Sie die Eigenschaften, indem Sie diese der Instanz zuweisen:
// Definiere neue Eigenschaften einer Instanz von außerhalb
meinPokemon.name = "Bisasam";
meinPokemon.typ = "Pflanze/Gift";
meinPokemon.groesse = 0.7;
meinPokemon.gewicht = 6.9;
15.3.2 Eigenschaften in die Symboldefinition aufnehmen
Damit Sie die Eigenschaften nicht für jede einzelne Instanz deklarieren müssen, platzieren Sie die Initialisierung im zugehörigen Movieclip-Symbol – vorzugsweise im ersten Bild. Der besseren Lesbarkeit wegen leitet das folgende Skript sämtliche Eigenschaften mit der Objektreferenz this ein – dies vermeidet außerdem Missverständnisse bezüglich der Gültigkeit von Eigenschaften:
// Definiere neue Eigenschaften innerhalb eines Symbols
this.name = "Bisasam";
this.typ = "Pflanze/Gift";
this.groesse = 0.7;
this.gewicht = 6.9;
Jede Instanz dieses Symbols wird somit von Begin an mit diesen Eigenschaften versorgt – einer individuellen Anpassung der Eigenschaftswerte jeder einzelnen Instanz steht natürlich nichts im Wege.
15.3.3 Eigenschaften allen Movieclips hinzufügen
Sollen jedoch nicht nur ausgewählte, sondern alle Movieclips zusätzliche Eigenschaften erhalten, dann funktioniert das mit Hilfe des Prototypen des Movieclip-Objektes (MovieClip.prototype). Die Eigenschaften dieses Prototypen gelten für alle mit ihm verbundenen Instanzen, also in diesem Fall für alle Movieclip-Instanzen. Bei einer Veränderung der Eigenschaft wird diese außerdem automatisch direkt der Instanz zugewiesen, was Seiteneffekte mit anderen Instanzen vermeidet:
// Definiere neue Eigenschaften einer Instanz innerhalb
MovieClip.prototype.name = "Bisasam";
MovieClip.prototype.typ = "Pflanze/Gift";
MovieClip.prototype.groesse = 0.7;
MovieClip.prototype.gewicht = 6.9;
15.3.4 addProperty
Falls eine Eigenschaft mit Funktionalität gekoppelt sein soll, dann bietet sich die Methode addProperty des Object-Objektes an. Diese Methode steht für alle Objekte in Flash zur Verfügung, da grundsätzlich alle Objekte die Eigenschaften und Fähigkeiten vom Object-Objekt übernehmen! Die Methode addProperty erfordert als Parameter den Namen der Eigenschaft und eine Funktion zum Ermitteln (getter) sowie eine Funktion zum Setzen (setter) der Eigenschaft.
// getter
brightness.fla
function ermittleHelligkeit() {
var farbInstanz = new Color(this);
var transformationsInstanz = farbInstanz.getTransform();
trace("bla:"+transformationsInstanz.rb);
var helligkeit =
(transformationsInstanz.rb+transformationsInstanz.rb+transformationsInstanz.bb)/3;
var helligkeitInProzent = helligkeit/2.56;
return helligkeitInProzent;
}
// setter
function setzeHelligkeit(helligkeitInProzent) {
var farbInstanz = new Color(this);
var helligkeit = 2.56*helligkeitInProzent;
var transformationsInstanz = new Object();
transformationsInstanz.rb = helligkeit;
transformationsInstanz.gb = helligkeit;
transformationsInstanz.bb = helligkeit;
new Color(this).setTransform(transformationsInstanz);
}
// Registriere die Eigenschaft
var success=meineMovieClipInstanz.addProperty("_brightness",
ermittleHelligkeit, setzeHelligkeit);
trace("Neue Eigenschaft registriert: " + success);
// Teste die Eigenschaft
meineMovieClipInstanz._brightness=50;
trace(meineMovieClipInstanz._brightness);
Um eine schreibgeschützte Eigenschaft zu erhalten, geben Sie anstelle der Setter-Funktion null als Parameter an:
// Getter
distance.fla
function ermittleAbstand() {
var point = new Object();
point.x = this._x;
point.y = this._y;
this._parent.localToGlobal(point);
var distance = Math.sqrt(point.x*point.x+point.y*point.y);
return distance;
}
// Registriere die Eigenschaft
meineMovieClipInstanz.addProperty("_distance", ermittleAbstand, null);
// Teste die Eigenschaft
trace(meineMovieClipInstanz._distance);
Natürlich ist es wie schon bei den normalen Eigenschaften möglich, die Definition innerhalb eines Movieclip-Symbols oder gleich für alle Movieclips durchzuführen. Achten Sie nur darauf, dass die Getter- und Setter-Funktionen so definiert sind, dass Flash sie findet; Bei einer Registrierung der Eigenschaft im Prototypen bietet sich zum Beispiel derselbe Ort für die Funktionen an:
// Getter
MovieClip.prototype.ermittleHelligkeit = function() {
var farbInstanz = new Color(this);
var transformationsInstanz = farbInstanz.getTransform();
var helligkeit =
(transformationsInstanz.rb+transformationsInstanz.rb+transformationsInstanz.bb)/3;
var helligkeitInProzent = helligkeit/2.56;
return helligkeitInProzent;
}
// Setter
MovieClip.prototype.setzeHelligkeit= function (helligkeitInProzent) {
var farbInstanz = new Color(this);
var helligkeit = 2.56*helligkeitInProzent;
var transformationsInstanz = new Object();
transformationsInstanz.rb = helligkeit;
transformationsInstanz.gb = helligkeit;
transformationsInstanz.bb = helligkeit;
new Color(this).setTransform(transformationsInstanz);
}
// Registriere die Eigenschaft
MovieClip.prototype.addProperty("_brightness",
MovieClip.prototype.ermittleHelligkeit,
MovieClip.prototype.setzeHelligkeit);
// Teste die Eigenschaft
meineMovieClipInstanz._brightness=50;
trace(meineMovieClipInstanz._brightness);
15.3.5 Fähigkeiten als globale Funktion zur Verfügung stellen
Reichen die Fähigkeiten von Movieclips einmal nicht aus, dann fassen Sie eine Folge von Anweisungen als neue Methode zusammen. Der einfachste, aber zugleich auch unkomfortabelste Weg ist, dass Sie eine Funktion deklarieren, der Sie die Objektreferenz (also den Instanznamen inklusive Pfad) und die Parameter übergeben:
_global.hflip = function(obj) {
hflip.fla
// Spiegele horizontal
obj._xscale *= -1;
};
// Teste die Fähigkeit
hflip(meineMovieClipInstanz);
15.3.6 Fähigkeiten einer Instanz hinzufügen
Eleganter ist es hingegen, wenn Sie die Funktion wie eine Eigenschaft direkt in der Movieclip-Instanz als Methode definieren und anstelle des Parameters für die Objektreferenz this verwenden:
meineMovieClipInstanz.hflip = function() {
flip.fla
// Spiegele horizontal
this._xscale *= -1;
};
// Teste die Fähigkeit
meineMovieClipInstanz.hflip();
15.3.7 Fähigkeiten in die Symboldefinition aufnehmen
Um die Zuweisung der neuen Fähigkeit zu vereinfachen, platzieren Sie die Methode direkt in den zugehörigen Movieclip-Symbolen, wodurch die Methode allen Instanzen dieser Symbole bekannt ist. Auch an dieser Stelle ist es empfehlenswert, der Methodendefinition das this voranzustellen, um die Lesbarkeit des Programmcodes zu verbessern. Innerhalb der Methoden ist das this ohnehin notwendig, um den Bezug zur Instanz bei der Ausführung korrekt herzustellen:
this.hflip = function() {
// Spiegele horizontal
this._xscale *= -1;
};
15.3.8 Fähigkeiten allen Movieclips hinzufügen
Möchten Sie Fähigkeiten für alle Movieclips verfügbar machen, dann funktioniert das mit Hilfe des Prototypen des Movieclip-Objektes (MovieClip.prototype). Die Fähigkeiten dieses Prototypen gelten für alle mit ihm verbundenen Instanzen, also in diesem Fall für alle Movieclip-Instanzen:
MovieClip.prototype.hflip = function() {
// Spiegele horizontal
this._xscale *= -1;
};
// Teste die Fähigkeit
meineMovieClipInstanz.hflip();
|