Flash Klassen

NoGFX

Erfahrenes Mitglied
Morgen,

ich bin auf der Suche nach einigen Hilfreichen Tutorials/Workshops über Flashklassen.

Man findet durchaus einiges via Google, oder auch hier im Board, selbst in der Dokumentation von Flash 8 etc. pp, allerdings kratzen diese das Thema meist nur an und gehen dann sofort in die vollen. Kennt jemand also das ein oder andere Tutorial in dem Flash Klassen von Grund auf, Schritt für Schritt erklärt werden?

Finde das ganze Thema doch etwas verwirrend ;)

Danke!
 
Hallo,

im Grunde genommen gibts nichts, was die Objekt-Struktur von AS 2.0 grundlegend von anderen objekt-orientierten Sprachen wie z.B. Java oder C# unterscheidet. Eine Klasse ist ein Prototyp eines Objekts, das alle seine Eigenschaften an eine Instanz (eine Kopie) dieser Klasse vererbt. Eine Klasse hat Eigenschaften/Member und Methoden (Funktionen) und einen Konstruktor (Funktion, die gleich heisst, wie die Klasse selbst und die bei der Instanzierung ausgeführt wird). Wie welches Element korrekt gecodet wird, entnimmst du der Flash-Hilfe.
Die eigentliche Schwierigkeit am klassischen objektorientierten Coden in Flash ist das Erkennen einer Notwendigkeit einer Klasse. In gewissen Situationen können einem Klassen das Leben erheblich erleichtern, weil sie z.B. oft benötigte Funktionalitäten verallgemeinern, vereinfachen, zusammenfassen etc. Man kann sich aber auch grauenhaft verrennen, wenn man Klassen zu coden beginnt, die eigentlich keine Verallgemeinerung darstellen, das Setting nur verkomplizieren und so für Verwirrung sorgen.

Zwei Beispiele:
Ich habe früher oft mit XML als Schnittstelle zwischen Server und Client gearbeitet, doch das Auslesen von XML-Strukturen in Flash war mir schnell zu umständlich. So habe ich eine Klasse geschrieben, die XML-Dateien laden und dann gleich in eine Objekt-Struktur umsetzen konnte. Ich habe diese Klasse über lange Zeit hinweg immer verwendet, sie hat meinen Arbeitsalltag erheblich vereinfacht.

Das Interval-Handling in Flash ist ziemlich umständlich und verwirrend, trotzdem sind Intervalle eine feine Sache. Hier findest Tobi's Klasse, die den Aufruf eines Intervalls auf die Instanzierung der Klasse reduziert.

Welche Vorgänge du gerne in Klassen geregelt haben möchtest, liegt an dir. Wichtig dabei ist bloss, dass du dich ewig um den kleinsten gemeinsamen Nenner bemühen solltest, ansonsten machen Klassen keinen Sinn.

Folgendes kleine Beispiel zeigt eine Klasse mit einem Member, der dann bei der Instanzierung (unteres Code-Feld) ausgegeben wird:

Code:
class HalloWelt {
    
    var str;   // <---Member / Eigenschaft

    function HalloWelt (s) { // <-- Konstruktor
        str = s;
    }

    function gibMirStr () { // <-- Methode
        return str;
    }
}

In einer *.fla:
Code:
var meineKlasse = new HalloWelt("Hallo Welt!");
trace (meineKlasse.gibMirStr());


gruss
 
Zuletzt bearbeitet:
Danke soweit.

Aber eines der Dinge, welche mich an Klassen bisher am meisten verwirrt ist die übergabe von Variablen, sowohl von dem .swf zur Klasse, als auch von der Klasse zu der .swf

Könntest du dazu noch etwas schreiben? Wäre dir sehr dankbar :)
 
Hallo,

mach da bloss kein Durcheinander: Der Compiler exportiert deine Klassen-Files bei entsprechendem import-Aufruf in die *.swf mit. Klassen werden also nicht zu Laufzeit interpretiert, sondern einmalig mitexportiert. Wenn du also Änderungen an einer Klasse vornimmst, musst du die *.fla, die die Klasse importiert, neu exportieren.
Deshalb ist deine Frage schon mal nicht ganz richtig. Du meinst wohl eher den Variablen-Transfer zwischen Zeitleisten/*.fla und einer Klasse.

Es gibt verschiedene Möglichkeiten, Variablen einer Klasse abzurufen bzw. aus einer Klasse Variablen der Zeitleiste abzurufen. Als Beispiel geh ich mal wieder von der obigen "HalloWelt"-Klasse aus, die du wie folgt instanzierst:

Code:
var instanz = new HalloWelt("Hallo Welt!");

Die Eigenschaft "str" dieser Hallo-Welt-Instanz wird im Konstruktor (der Funktion "HalloWelt") mit dem Parameter "s" belegt, in diesem Falle mit "Hallo Welt". Nun gibt es verschiedene Möglichkeiten, diese Variable von der Zeitleiste aus abzurufen:

1. Die banale Ar - referenzierent:
Du referenzierst die Variable via Instanz- / und Eigenschaftsnamen.
Code:
 trace (instanz.str);
//output: Hallo Welt!

2. Eine return-Funktion:
Ein return in einer Funktion markiert einerseits das Ende der Funktion, gibt aber auf Wunsch auch einen Wert zurück. Betrachte nun die Methode (Funktion) "gibMirStr". Diese Funktion beinhaltet bloss die Zeile
Code:
return str;
Diese Funktion steht also für den Wert der Variable "str".
Code:
trace(instanz.gibMirStr);
//output: Hallo Welt!
Dazu ein Beispiel aus dem Flash-Alltag:
Mit der Funktion "getNextHighestDepth" kann man sich ja die höchste freie Tiefenebene eines MovieClips ausgeben lassen. Die Funktion liest diesen Wert irgendwie aus und gibt dann das Resultat mit return zurück. Der Aufruf "this.getNextHighestDepth" steht sozusagen für das Resultat, so dass man den Funktionsaufruf wie eine Variable verwenden kann:
Code:
this.createEmptyMovieClip ("mc", this.getNextHighestDepth());
Die Verwendung von return macht dann Sinn, wenn du das Ergebnis eines Verarbeitungsprozesses ausgeben willst, dieses Ergebnis aber nicht zwingend eine Eigenschaft der Klasse darstellt.

3. get / set:
Ein prominentes Beispiel für eine get- /set-Funktion sind die Koordinaten von MovieClips. Wenn du z.B. diese Anweisung ausführst,
Code:
mc._x = 90;
ist das im Prinzip nichts anderes als würdest du eine Funktion _x mit einem Paramter, der Zahl, ausführen:
Code:
mc._x(90);
Die Eigenschaft "_x" steht also für den Funktionsnamen, die Zahl nach dem "="-Zeichen den Parameter-Wert. Dieses Konstrukt ist nur für Klassen gültig. Eine set-Funktion für die Eigenschaft str unserer HalloWelt-Klasse könnte also z.B. so aussehen:
Code:
function set wert (variable) {
    str = variable;
}
In der *.fla könntest du die Funktion dann so aufrufen
Code:
instanz.wert = "www.tutorials.de";
Analog funktionieren get-Funktionen. Der Code
Code:
xKoordinate = mc._x;
ist im Prinzip nichts anderes als der Aufruf der Funktion _x, die, wie oben erklärt, via return einen Wert zurück gibt. Würden wir dasselbe nun mit unserer Klasse tun, würde das so aussehen:
Code:
 function get wert () {
    return str;
}
*.fla:
Code:
trace (instanz.wert);
//output: www.tutorials.de

gruss
 
Zuletzt bearbeitet:
Zurück