Pastor Pixel Tipps Tutorial Anleitungen Hilfe

Objektorientiertes Programmieren

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 {

public class MyClass {

public var textVariable:String = "some default value";
public var numericVariable:Number = 17;
public var dateVariable:Date;
public function myMethod(param1:String, param2:Number):void
{
// Aktion mit Parametern ausführen
}

public function MyClass() {

// Aktionen zum Festlegen der Startwerte der Eigenschaften ausführen

// und andernfalls das Objekt einrichten

textVariable = "Hello there!";

dateVariable = new Date(2001, 5, 11);

}

}

}

 

Den folgenden Inhalt dieser Seite kann man sich auch hier, alternativ als swfSWF-Datei anschauen.

Die erste Klasse

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"));

Klasse im Unterverzeichnis

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"));

 

Dokumentklasse

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

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");

 

Get Set Methode

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

Vererbung in Klassen

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());


Zwei Klassen in einer Klassendatei

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());

Überschreiben in der erbenden Klasse

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());
}

super() / Basis Klasse mit Konstruktor und Parametern

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

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);

public static Attribut

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));

public static weiteres Beispiel

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();

Attribute

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

Klassen und Objekte

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.

Für den Inhalt dieser Seite ist eine neuere Version von Adobe Flash Player erforderlich.

Adobe Flash Player herunterladen

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);

Namenskonvention

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.

 

Zugriff auf die Instanz stage über die Eigenschaft stage

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

Für den Inhalt dieser Seite ist eine neuere Version von Adobe Flash Player erforderlich.

Adobe Flash Player herunterladen

Der Vorhang hebt sich die Bühne belebt sich.
Ein Klick auf die Models öffnet die Bühne.

(Fashion by Alexander McQueen)

 

Klassenbibliotheken einbinden

Was ist ein Framework

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.

Klassenblibliotheken / SWC- Dateien einbinden

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.

Klassendateien einbinden

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 einbinden

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