Die objektorientierte Programmierung nutzt Abstraktion und Verkapselung, um Objekte zu erstellen. Das Design der Software besteht aus einer Anzahl miteinander kommunzierender und interagierender Objekte. Es hilft sich ein Auto oder eine andere Maschine vorzustellen, die aus vielen Bauteilen oder kleineren unabhängigen Maschinen besteht, die Nachrichten aussenden und empfangen, Daten verarbeiten oder Nachrichten zu anderen Bauteilen schicken. Eine traditionellere Art der Programmierung ist beispielsweise die funktionale Programmierung, wobei die Software aus einer einfachen Auflistung von Funktionen und Befehlen besteht.
Jede von Ihnen deklarierte Variable, jede von Ihnen geschriebene Funktion und jede von Ihnen erstellte Klasseninstanz ist ein Objekt. Man kann sich ein ActionScript 3.0-Programm als eine Gruppe von Objekten vorstellen, die Aufgaben ausführen, auf Ereignisse reagieren und miteinander kommunizieren.
In ActionScript 3.0 wird jedes Objekt durch eine Klasse definiert. Eine Klasse kann man sich als Vorlage oder Entwurf für den Typ eines Objekts vorstellen. Jeder der ein bischen mit Flash gearbeitet hat, kennt das Prinzip schon. Der Movieclip (in der Bibliothek) ist die Klasse, die Instanz auf der Bühne ist das Objekt, welches Eigenschaften (z.B.: xPosition) und Methoden besitzt ( z.B.: gotoAndStop(2));
Bei der objektorientierten Programmierung in ActionScript weist jede Klasse drei Merkmale auf:
Auch das kennt man schon, so besitzt ein Movieclip unter anderem die Eigenschaft xPosition, die Methode play() und das Ereignis EnterFrame.
Eine Klasseninstanz (Objekt) erstellen Sie mit dem Operator new. z.B.:
var myBirthday:Date = new Date();
Hier einige Begriffe:
Obektorientierte Programmierung Javascript
Klassen definieren siehe Livedocs
Objektorientiertes Programmieren Adobe
weiterführende Themen bei Adobe
weiterführende Themen hier, Display Objects/ MovieClips
package mypackage {
} |
Den folgenden Inhalt dieser Seite kann man sich auch hier, alternativ als SWF-Datei anschauen.
Klassen werden in as Dateien definiert. Der Name der Klasse muss genauso lauten wie der Name der as Datei.
Wenn man hinter package keinen Klassenpfad angibt und die Datei im gleichen Verszeichnis liegt wie die fla kann man die Objekte einfach in der fla instanzierien mit dem Schlüsselwort new
Die as Datei wird in die swf Datei integriert.
Außerdem können Klassen in einem Verzeichnis liegen welches man unter Voreinstellungen festlegt. Dort ist auch das Verzeichnis, in dem alle Flash Klassen standardmäßig liegen.
Eine weitere Möglichkeit den Klassenpfad zu bestimmen, besteht unter Datei/ Einstellungen für Veröffentlichung/ flash / Actionscript3 / Einstellungen
Eine Dokumentklasse kann man im Eigenschaftenfenster definieren siehe dazu
dokumentKlasse.fla Siehe auch zweiteKlasse.fla dort liegt die Klasse in einem Unterverzeichnis. Mehr dazu später.
Action der Klasse SomeClass
package { public class SomeClass { public var farbe:String = "rot"; public function showPara(para:String):String { return "Lorem " + para; } } }
Actionscript im ersten Bild der fla Datei
var someObj:SomeClass = new SomeClass(); trace(someObj.farbe); someObj.farbe="blau"; trace(someObj.farbe); trace(someObj.showPara("ipsum"));
Hier liegt die Klasse in dem Unterverzeichnis "box".
Das Unterverzeichnis wird hinter package angegeben. Selbstvertändlich kann man auch weitere Unterverzeichnisse anlegen.
Auch hier sieht man wieder eine Eigenschaft und eine Methode, die aufgerufen werden mit der Punktsyntax.
1.) der Ordner, in dem die *.as liegt, ist im gleichen Verzeichnis wie die fla
2.) der Ordername wird in der *.as hinter package angegeben
3.) der Ordnername wird in der fla in der import Anweisung angegeben (Pfad, Punktsyntax)
Die Actions der Klasse
package box { public class bKlasse { public var bEigenschaft:String = "laut"; public function bMethode(param:String):String { return "Rückgabe der Methode: " + param; } } }
Die Actions in der fla
import box.bKlasse; var someObj:bKlasse = new bKlasse(); someObj.bEigenschaft="leise"; trace(someObj.bEigenschaft); trace(someObj.bMethode("RocknRoll"));
Die Dokumentklasse wird im Eigenschaftenfenster angegeben.
Sie muss von Flash Display MovieClip erben. Sie gilt für die Hauptzeitleiste.
Sie besitzt einen Konstruktor, d.h. eine Methode, die wie die Klasse heißt und beim erstem Erstellen eines Objekts aus der Klasse ausgeführt wird. Hat man eine Konstruktfunktion, wird diese beim Start der SWF Datei ausgeführt.
Achten Sie darauf, dass in den Datei/Einstellungen für Veröffentlichung/ Actionscript3 Einstellungen/ Bühne (Bühneninstanzen automatisch deklarieren) aktiviert ist
Eine Dokumentklasse wird meist dazu verwendet, Einstellungen und Steuerungen vorzunehmen, die beim Laden des Films ausgeführt werden müssen. Es macht Sinn hier Event Listener unterzubringen, die für den gesamten Film gelten. Im Prinzip enthält die Dokumenklasse die Aktionen, die früher im ersten Bild der Zeitleiste untergebracht wurden.
Dokumentklasse MyDocClass.as
package { import flash.display.MovieClip; public class MyDocClass extends MovieClip { public function MyDocClass():void { trace("Hallo Welt"); } } }
Die Konstruktor Methode heißt genauso wie die Klasse. Sie wird ausgeführt wenn das Objekt instanziiert wird. Sie kann Parameter übernehmen, aber keine Rückgabewerte haben.
Actionscript der Klasse
package { public class SomeClass { public function meinKonstrukt(para:String) { trace( "Hallo " + para); } } }
Actionscript im ersten Bild der fla
var someObj:SomeClass = new SomeClass("Welt");
Da hier eine private Variable definiert wurde ist es nicht möglich, diese von außen zu ändern oder einzusehen.
Es ist ein Paradigma der objektorientierten Programmierung die Dinge in der Klasse zu kapseln. Um dennoch von außen die Eigenschaft zu ändern wird die Setter Methode benutzt oder um die Eigenschaft abzufragen wird die Getter Methode eingesetzt. Beachte, dass es von außen so aussieht als hätte man es hier mit Eigenschaften und nicht mit Methoden zu tun. In diesem Beispiel bietet die Setter Methode die Möglichkeit den eingegebenen Wert zu ändern. Sollte der Wert 0 eingegeben werden, wird dieser auf 1 erhöht.
Actionscript der Klasse
package { public class FrameGetSet { private var frameNo:uint = 1; public function get frameNr():uint { return frameNo; } public function set frameNr(nr:uint):void { if (nr < 1) { frameNo = 1; } else { frameNo = nr; } } } }
Actionscript im ersten Bild der fla
var xyz:FrameGetSet= new FrameGetSet(); xyz.frameNr = 0; trace(xyz.frameNr); //1
Mit dem Schlüsselwort extends kann man in der erbenden Klasse die vererbende Klasse angeben.
Nur wenn die Variablen oder Methoden private sind können Sie in der erbenden Klasse nicht verändert werden.
Das Attribute protected verhindert den Zugriff von außen, aber erlaubt den Zugriff in der erbenden Klasse.
Actionscript der Klasse
package { public class AClass { protected var farbe:String = "rot"; } }
Actionscript der Klasse
package { public class BClass extends AClass { public function showColor():String { return "ich habe folgende farbe geerbt: " + farbe; } } }
Actionscript im ersten Bild der fla
var someObj:BClass = new BClass(); trace(someObj.showColor());
Man kann mehrere Klassen in einer as Datei definieren, aber man kann von außen nicht auf diese zusätzlichen Klassen zugreifen. Man kann nur innerhalb der as Datei ein Objekt der zusätzlichen Klasse erstellen. Der Zugriff von außen ist nur auf die eine public class möglich. Beachte auch, dass die weiteren Klassen außerhalb von package{} definiert sind.
Actionscript der Klasse
package { public class zweiKlassen { public function ausgabe() { var nObjekt:basisKlasse = new basisKlasse(); nObjekt.ausgabe2(); return nObjekt.b; } } } class basisKlasse {; public var b:String = "es gibt kein Bier"; public function ausgabe2():void { trace("basisKlasse.ausgabe2()"); } }
Actionscript im ersten Bild der fla
var testObjekt:zweiKlassen = new zweiKlassen(); trace(testObjekt.ausgabe());
Jetzt wird es ein bisschen komplizierter.
Hier wurde das Beispiel zweiKlassen etwas verändert. Wir haben hier eine weitere Klasse die von der Klasse "basisKlasse" erbt. (extends) außerdem wird mit override die Funktion ausgabe2(), überschrieben.
Die protected Variable b kann zwar in der erbenden Klasse verwendet werden. Außerhalb kann b nicht aufgerufen werden. trace(nObjekt.b); in der ausgabe() funktion der "ueberschreiben" Klasse ist nicht zulässig.
Actionscript der Klasse
package { public class ueberschreiben { public function ausgabe() { var nObjekt:erbKlasse = new erbKlasse(); nObjekt.ausgabe2(); } } } class basisKlasse { protected var b:String = "Lorem ipsum"; public function ausgabe2():void { trace("ausgabe2() von basisKlasse"); } } class erbKlasse extends basisKlasse { override public function ausgabe2():void { trace("override ausgabe2()+ "+b); } }
Actionscript im ersten Bild der fla
var someObj:ueberschreiben = new ueberschreiben(); trace (someObj.ausgabe()); }
Hat man in der BasisKlasse, von der geerbt wird, einen Konstruktor mit Parametern, so muss man in der erbenden Klasse die Methode super() aufrufen. super() bedeutet der Konstruktor wird in der erbenden Klasse aufgerufen. Gibt man super(); nicht ein, wird das automatisch als erstes in der erbenden Klasse von Flash gemacht. Sofern man Parameter hat, muss man diesen Parametern einen Wert zuweisen, wenn man super aufruft. Es ist nicht nötig super(); direkt als erstes einzufügen, man könnte auch erst irgendwelche Berechnungen ausführen und dann den Konstruktor der Basisklasse aufrufen.
Actionscript der Klasse von der geerbt wird
package { import flash.display.MovieClip; public class BasisClass extends MovieClip { protected var breite:Number; public function BasisClass(_breite:Number) { breite = _breite; this.graphics.beginFill(0x5500ff); this.graphics.drawRect(0,0, breite, breite); } } }
Actionscript der erbenden Klasse
package { public class ChildClass extends BasisClass { public function ChildClass(vBreite:Number) { super(vBreite); } } }
anderes Beispiel der erbenden Klasse
package { public class ChildClass extends BasisClass { public function ChildClass(vBreite:Number) { var halbeBreite:Number = vBreite / 2; super(halbeBreite); } } }
noch ein Beispiel der erbenden Klasse
package { public class ChildClass extends BasisClass { public function ChildClass() { super(20); } } }
Schnittstellen definieren die Signatur von Methoden (Funktionen, Parameter, Rückgabewerte), um bei größeren Projekten ein einheitliches Schema vorzugeben. Man legt eine Schnittstelle mit dem Schlüsselwort interface an. Das Implementieren der Schnittstelle geschieht mit dem Schlüsselwort implements . Die Klasse, welche die Schnittstelle implementiert muss alle Methoden der Schnittstelle enthalten.
Actionscript der Schnittstelle
package { public interface Schnittstelle { function weite(w:int):int function hoehe(h:int):int } }
Actionscript der Klasse
package { public class Halbierer implements Schnittstelle { public function weite(w:int):int { var weite:int = w / 2; return weite; } public function hoehe(h:int):int { var hoehe:int = h / 2; return hoehe; } } }
Actionscript im ersten Bild der fla
var meinHalbierer:Halbierer; meinHalbierer = new Halbierer(); var halbeWeite:int = meinHalbierer.weite(200); var halbeHoehe:int = meinHalbierer.hoehe(300); trace(halbeWeite); trace(halbeHoehe);
Auf static kann man zugreifen, ohne das ein Objekt instanziiert wird, der Klassenname wird vorangestellt. Man kennt das vom Mathe Objekt.
Da die statischen Funktion über die Klasse aufgerufen werden, könnte man beispielweise ermitteln, wieviele Instanzen einer Klasse existieren, indem man im Konstruktor einen Zähler einbaut. Siehe Adobe Referenzen.
Actionscript der Klasse Numerologie
package { public class Numerologie { public function Numerologie() { } public static function quersumme(zahl:Number):Number { if ((zahl%9)!=0) { ; var ergebnis:Number = zahl % 9; } else { ; ergebnis = 9; } return ergebnis; } } }
Actionscript im ersten Bild der fla
trace(Numerologie.quersumme(23));
MIt statischen Funktionen eine Formelsammlung zu erstellen ist eine Sache. Hier wird eine andere Möglichkeit vorgestellt. Über die statische Funktion hideFlotte werden alle Instanzen der Klasse Raumschiff unsichtbar gemacht, da alle Instanzen in einem Array gespeichert wurden. Auch das Array ist unter einer statischen Variablen abgespeichert.
Actionscript der Klasse
package { import flash.display.MovieClip; public class Raumschiff extends MovieClip { public static var flotte:Array = new Array(); public function Raumschiff() { flotte.push(this); } public static function hideFlotte():void { for (var i:Number=0; i< flotte.length; i++) { flotte[i].visible = false; } } } }
Actionscript im ersten Bild der fla
var s1:Raumschiff = new Raumschiff(); var s2:Raumschiff = new Raumschiff (); var s3:Raumschiff = new Raumschiff (); Raumschiff.hideFlotte();
Klassen, Variablen, Methoden bestizen Attribute , welche die Zugriffsmöglichkeiten oder die Sichtbarkeit definieren.
public
Es ist außerhalb der Klasse zugänglich. So muss beispielsweise der Konstruktor immmer public sein. (die Funktion gleichen Namens, welche beim instanziieren aufgerufen wird).
private
kann man nur innerhalb der Klassendefinition verwenden, von außen hat man keinen Zugriff.
protected
Wie bei private hat man keinen Zugriff von außen, aber in der erbenden Klasse kann man darauf zugreifen.
internal
ist der Standardwert wenn gar nichts angegeben ist, hier hat man Zugriff innerhalb des gleichen Pakets.
public static
Auf static kann man zugreifen, ohne dass ein Objekt instanziiert wird, der Klassenname wird vorangestellt. Beispielsweise das Mathe Objekt braucht nicht instanziiert zu werden, man greift einfach über den Klassennamen auf die Funktionen und Eigenschaften zu, z.B.: Math.PI
Hier geht es darum, wie Klassen miteinander interagieren kommunizieren. Da in einer Klasse alles gekapselt ist, kann man innerhalb nicht auf Instanzen zugreifen, die irgendwo eventuell erzeugt wurden.
Zum Beispiel: ich habe eine Klasse "Bullet", welche per Hittest überprüft, ob Sie eine Instanz der Klasse "Ziel" getroffen hat, um dann diese Instanz zu verändern, beispielsweise unsichtbar zu machen. In AS2 wäre es möglich gewesen die Instanznamen der "Ziel" Instanzen einfach in der Zeitleiste des "Bullet" Movieclips aufzuführen.
In AS3 oder einer anderen objektorientierten Programmiersprache, kann man eine oder mehrere Instanzen der Zielklasse deklarieren und diesen dann eine Referenz der Instanzen, welche außerhalb liegen, zuzuweisen.
Actionscript der Klasse BlackRect, zu der es auch einen MovieClip in der Bibliothek gibt
package { import flash.display.MovieClip; import flash.events.MouseEvent; public class BlackRect extends MovieClip { protected var _ziel:MovieClip; public function BlackRect(ziel:MovieClip) { _ziel = ziel; addEventListener(MouseEvent.CLICK, moveZiel); } protected function moveZiel(evt:MouseEvent):void { _ziel.x += 10; } } }Deklaration und Initialisierung im ersten Bild der fla. Auf der Bühne befindet sich eine MovieClip Instanz mit Instanznamen kreis.
var black:BlackRect = new BlackRect(kreis); black.x=10; black.y = 10; addChild(black);
Es gibt gewisse Konventionen, die man einhalten kann, aber nicht muss. So beginnt man Klassennamen mit einem Großbuchstaben.
Gibt es eine Eigenschaft, auf die es einen Verweis von außen gibt, wie im vorigen und folgenden Beispiel, so schreibt man den Instanznamen mit einem Unterstrich zu Anfang. Der Verweis über einen Parameter hat die gleiche Bezeichnung ohne den Unterstrich.
Ich habe leider in meinen Tipps viele Beispiele, wo ich es aus Unwissenheit genau umgekehrt gemacht habe. Jedoch werde ich mich in Zukunft auch an diese Konvention halten. Der Vorteil ist, dass man an der Schreibweise sofort erkennt, dass es einen Verweis von außen gibt.
Ein Sprite besitzt die Eigenschaft stage. Über diese Eigenschaft kann man auf die Hauptbühne stage zugreifen. Jede Instanz besitzt die Eigenschaft stage. Damit greift man damit auf die eine Hauptbühne zu, die nur einmal existiert. Die Eigenschaft stage steht erst zur Verfügung wenn die Instanz der Display Liste hinzugefügt wurde. Ansonsten ist der Standartwert null. Siehe dazu auch den Beitrag unter "addChild(), Displayliste: added_to_stage
Der Vorhang hebt sich die Bühne belebt sich.
Ein Klick auf die Models öffnet die Bühne.
(Fashion by Alexander McQueen)
Auf dieser Seite wird erläutert, wie man eigene Klassen erstellt. Dadurch hat man die Möglichkeit komplexe Programmierungen zu erstellen. Die Programmierungen werden in Klassendateien, die wiederum in Paketen / Ordnern geordnet sind ausgelagert. So eine zusammenhängende Programmierung die bestimmte Aufgaben erfüllt nennt man Framework. Man kann Frameworks im Netz erwerben oder frei herunterladen. So gibt es beispielsweise Frameworks, wie Physic Engines (2DBox), die physikalische Eigenschaften simulieren, oder 3D Frameworks (papervision3D), Tweening Engines (greensock.com), um nur einige zu nennen.
Es macht Sinn sich einen Ordner im Hauptverzeichnis anzulegen, in dem man alle Frameworks einfügt. Jedes Framework/ Klassenbibliothek bekommt einen Ordner.
Wie gesagt, Klassenbibliotheken oder Frameworks können aus mehreren Klassendateien mit Endung as bestehen, die in Ordnern/ Pakten abgelegt sind. Um einen Ordner oder eine Ordnerstruktur mit diesen Dateien einzubinden gehe auf:
Bearbeiten, Voreinstellungen, (Kategorie:) Actionscript, (Actionscript3 Einstellungen:)
Quellpfad / Ordner mit Actionscript Klassendateien
Bibliothekspfad / SWC Dateien oder Ordner mit SWC Dateien
Pfad einer externen Bibliothek: SWC Dateien die als Runtime Shared Library verwendet werden
Im Actionscript Code muss man je nach Ordnerstruktur mit einer Import Anweisung auf den entsprechenden Unterordner oder die Klassendatei verweisen.
import com.google.maps.LatLng;
Hiermt verweist man auf einen Unterordner com / google / maps / LatLng
Diese Ordnerstruktur befindet sich in einem Ordner, der auf die oben beschriebene Weise eingebunden wurde.
Wichtig ist hierbei, dass es keine Konflikte durch gleichlautende Namen gibt.
Ein Beispiel
Eine Klassendatei MyClass.as liegt im Ordner
C:/FlashProjekte/pastorpixel/de/pastorpixel/basic
Die Klasse MyClass.as beginnt folgendermaßen:
package de.pastorpixel.basic
Man kann in der fla Datei auf 2 Arten auf den Pfad verweisen:
Dort gibt man folgenden Pfad ein oder wählt diesen über das Ordnersymbol aus
C:\FlashProjekte\pastorpixel
Im ersten Frame der fla oder in der Klassendatei wird auf die Klasse MyClass.as verwiesen:
import de.pastorpixel.basic.MyClass;
Komponenten werden in der Regel über den "Extension Manager" eingebunden. Das ist ein Programm, mit dem man auch für andere Adobe Programme Erweiterungen hinzufügt und verwaltet.
Eine SWC Datei als Komponente hinzufügen
Man kann Dateien auch in den entsprechenden Komponenten Ordner kopieren:
CS3
C:Program FilesAdobeAdobe Flash CS3 languageConfiguration Components
CS4
C:Program FilesAdobeAdobe Flash CS4 Common Configuration Components
CS5
C:Program FilesAdobeAdobe Flash CS5 Common Configuration Components
Man sollte sich dort einen entsprechenden Unterordner anlegen.
Startseite: www.pastorpixel.de