Anzeige
Tutorialbeschreibung

Erstellen eines AudioPlayers in Actionscript 3

Erstellen eines AudioPlayers in Actionscript 3

In diesem Tutorial werden wir einen Audioplayer in Flash mithilfe von Actionscript 3 erstellen. Dazu benötigt ihr eine Play-, eine Pause-, eine Weiter- und eine Zurück-Schaltfläche. In der Illustrator-Arbeitsdatei sind diese exemplarisch enthalten. Für diese Arbeitsdatei solltet ihr mindestens Adobe Illustrator CS4 haben. Zudem benötigt ihr natürlich noch Flash, und zwar in der Version CS4 mit dem Flashplayer 10.

Funktionen des AudioPlayers sind Abspielen, Pause und einen Song weiter- bzw. zurückschalten. Einen Schnellvorlauf des Songs gibt es NICHT.


Vorweg einige Anmerkungen:

• Ich werde eine Dokumentenklasse benutzen, also nicht das Aktionenfenster von Flash.
• Ich werde anfangs meist Tastenkürzel nutzen, die auf dem Mac funktionieren. D.h., Windows-Benutzer müssen anstatt CMD die Taste Strg nutzen.


Schritt 1

Wir beginnen damit, eine neue Flashdatei zu erstellen.

CMD+N, dann "Flash-Datei (ActionScript 3)" auswählen und auf OK drücken.

Wir speichern die Datei gleich mit CMD+S in einem beliebigen Ordner unter den Namen "music.fla". Ihr könnt natürlich auch einen anderen Namen nutzen.

Bilder



 

Schritt 2

Wir erstellen gleich auch die erste von zwei Klassen, die wir nutzen werden.

Zuerst die Dokumentenklasse: CMD+N, dann "ActionScript-Datei" auswählen und auf OK drücken.

Bilder



 

Schritt 3

Speichert die Datei sogleich unter dem Namen "AudioPlayer.as" in dem Unterordner "script".

Bilder



Schritt 4

Nun schreibt ihr das Folgende in das gerade geöffnete Fenster:

Bilder



In Zeile 1 geben wir an, in welchem Package die Datei liegt. In unserem Fall "script".

In Zeile 3 importieren wir die erste Klasse "MovieClip". Anders als in fla-Dateien müsst ihr in externen ActionScript-Dateien immer alle Klassen erst importieren, um sie nutzen zu können. Würden wir also den Sourcecode dieser Klasse direkt in das Aktionen-Fenster in Flash schreiben, müssten wir die MovieClip-Klasse nicht importieren. Zudem würde das package auch entfallen.

In Zeile 5 erstellen wir nun unsere Klasse. Jede Klassendefinition ist im Prinzip so aufgebaut wie hier. Zuerst gebt ihr an, dass die Klasse public (also für alle sichtbar) ist, gebt an, dass es sich um eine Klasse handelt, und gebt der Klasse ihren Namen. Da wir diese Datei "AudioPlayer.as" genannt haben, muss die Klasse zwingend "AudioPlayer" (ohne .as) heißen.

Da wir hier eine Dokumentenklasse erstellen, muss diese entweder von MovieClip oder von Sprite abgeleitet werden. Das tun wir mit dem Schlüsselwort extends und der Angabe der Klasse (hier MovieClip).

Von Zeile 7 bis 9 seht ihr die Konstruktorfunktion, die immer aufgerufen wird, sobald wir ein neues Objekt erstellen oder - wie hier - die Flashapplikation starten.

Konstruktorfunktionen (oder kurz Konstruktoren) sind immer öffentlich (public), haben danach das Schlüsselwort Funktion und den Namen der Klasse. Da es eine Funktion ist, dürfen die zwei Klammern nicht fehlen. Anders als bei anderen Funktionen in ActionScript muss bei Konstruktoren kein Rückgabewert angegeben werden. Die Rückgabewerte werden wir später noch bei anderen Funktionen sehen.

Um nun zu testen, ob die Verbindung zwischen Flash und der Dokumentenklasse besteht, geben wir ein "OK" aus, wenn dies der Fall ist.

Solltet ihr jetzt über CMD+Enter die Flashapplikation testen wollen, so werdet ihr sehen, dass zwischen den beiden noch keine Verbindung besteht.


 

Schritt 5

Dies tun wir jetzt. Wechselt also wieder zur music.fla-datei und dort in das Eigenschaften-Fenster.

Dort gebt ihr nun "script.AudioPlayer" an. (Hier ohne .as!)

Da wir hier gerade sind, ändert die Dimensionen der Bühne auf 200 x 95 Pixel und die Framerate auf 120. Da wir in dieser Flash-Applikation mit MouseOver- und MouseOut-Ereignissen arbeiten werden, empfiehlt sich immer eine hohe Framerate.

Bilder



 

Schritt 6

Wenn ihr jetzt über CMD+Enter die Flashapplikation testet, werden ihr in der Ausgabe sehen, dass "OK" dort steht.

Bilder



 

Schritt 7

Dann importieren wir die Schaltflächen aus der Illustrator-Datei. Ihr könnt selbst verständlich auch eure eigenen nutzen. Diese sollten nur 30 x 30 Pixel groß sein.

Um diese zu importieren, wählen wir Datei>Importieren>In Bibliothek importieren. Wählt dann die Datei "AudioPlayer.ai" aus.

Bilder



 

Schritt 8

Wählt im folgenden Dialog alle vier Ebenen aus und importiert sie als MovieClips, indem ihr auf OK klickt.

Bilder



 

Schritt 9

Das Folgende müsst ihr für alle vier Schaltflächen tun. Exemplarisch für den PauseBtn:

Wählt zuerst den PauseBtn aus und klickt doppelt darauf. Benennt die "Ebene 1" um in "BG" und fügt eine neue Ebene hinzu, die ihr "layer" nennt.

Bilder



 

Schritt 10

Klickt auf den ersten Frame der Ebene "layer" und gebt im Eigenschaften-Fenster den Namen "out" ein.

Bilder



 

Schritt 11

Fügt auf dieser Ebene auf Frame 10 ein neues Schlüsselbild mit F6 ein. Gebt dieser im Eigenschaften-Fenster den Namen "over".

Bilder



 

Schritt 12

Fügt nun in Frame 10 auf der Ebene BG ein neues Schlüsselbild ein, und löscht den oberen PauseBtn.

Bilder



 

Schritt 13

Den unteren verschiebt ihr nun auf die y-Position 0 im Eigenschaften-Fenster (nachdem ihr den PauseBtn angeklickt habt).

Bilder



 

Schritt 14

Geht auf Frame 1 und löscht diesmal den unteren PauseBtn. Ihr habt jetzt also jeweils nur einen PauseBtn auf Frame 1 und 10.

Bilder



 

Schritt 15

Letzter Schritt für den PauseBtn: Mit einem Rechtsklick auf den PauseBtn in der Bibliothek wählt ihr die Eigenschaften aus.

Bilder



 

Schritt 16

Dort klickt ihr auf Export für ActionScript und klickt OK. Die nächste Warnung könnt ihr überspringen.

Bilder



Schritt 17

Folgt dieser Anleitung auch für die anderen drei Schaltflächen.


 

Schritt 18

Nachdem ihr mit allen vier Schaltflächen fertig seid, geht wieder zur "AudioPlayer.as"-Datei und fügt weitere import-Anweisungen ein. Diese werden wir im Laufe des Tutorials nutzen.

Bilder



 

Schritt 19

Nun erstellen wir die Schaltflächen, sodass sie in der Flashapplikation zu sehen sind. Dazu erstellen wir jeweils eine Variable und im Konstruktor erstellen wir je ein neues Objekt davon. Da wir im Konstruktor diese Schaltflächen noch nicht auf die Bühne packen, lassen wir diesen Schritt vorerst sein.

Bilder



 

Schritt 20

Wir erstellen nun einen Loader, der unsere XML-Datei lädt. Diese muss auf der gleiche Ebene wie die fla-Datei liegen und trägt den Namen "musicdata.xml".

Wir erstellen also zuerst einen Loader, um ihm dann einen EventListener hinzuzufügen. Wenn die XML-Datei fertig geladen ist (Event.COMPLETE), dann ruft ihr die Methode completeXMLHandler auf.

Anschließend sagen wir dem Loader, er soll die Datei "musicdata.xml" laden. Da die load-Methode vom URLLoader keinen String-, sondern einen URLRequest erwartet, erstellen wir also auch ein URLRequest-Objekt innerhalb des Funktionsaufruf.


Bilder



 

Schritt 21

Nun kurz zum Aufbau der XML-Datei. Der Aufbau sieht für drei Songs folgendermaßen aus:

Für jeden Song solltet ihr den Interpreten, den Titel und die URL zum Song angeben. Wie ihr seht, nutze ich einen Unterordner namens "music". Dies könnt ihr ebenfalls so handhaben.

Bilder



 

Schritt 22

Um zu testen, ob eure XML-Datei erfolgreich geladen wurde, geben wir diese aus, nachdem wir aus dem Inhalt des URLLoaders ein XML-Objekt erstellt haben. War dies erfolgreich, so werdet ihr beim Testen die XML in der Ausgabe sehen.

Bilder



 

Schritt 23

Um weiter fortzusetzen, müssen wir die angesprochene zweite Klasse erstellen. Geht wie in Schritt 3 und 4 vor, nennt diese ActionScript-Datei "Song" und speichert sie im Unterordner script.


Schritt 24

Die Struktur dieser Klasse sieht so aus:

Bilder



Da "Song" kein Objekt sein wird, das auf der Bühne zu sehen ist, muss es nicht von MovieClip abgeleitet werden. Wir geben dem Konstruktor aber einen Parameter mit, der einen Teil aus der XML-Datei darstellt. XML ist eine Klasse, die ihr nicht importieren müsst, da sie immer verfügbar ist.


 

Schritt 25

Wir befüllen diese Klasse nun mit Inhalt. Dazu werden wir drei Variablen anlegen, die den Interpreten, den Titel und die URL speichern. Zudem werden wir get-Methoden erstellen, um auf diese Variablen zugreifen zu können. Diese Technik (die Variablen protected zu machen und get- bzw. set-Methoden anzubieten) ist nahezu Standard beim Programmieren.

Um die Variablen mit Inhalt zu befüllen, nutzen wir den xml-Parameter des Konstruktors. Die xml-Variable enthält EINEN Song aus der XML-Datei.

Bilder



 

Schritt 26

Wir wechseln zurück zur AudioPlayer-Klasse und fügen der completeXMLHandler-Methode dies hinzu:

Bilder



Wir gehen in der foreach-Schleife also durch alle Song-Elemente in der XML-Datei. Von jedem Songelement erstellen wir ein Song-Objekt und fügen das dem songArray hinzu.

Wie ihr bemerkt, fehlt uns aber noch das songArray. Im Bild könnt ihr sehen, dass ihr zuerst eine Variable mit diesem Namen erstellen und dann ein Objekt davon im Konstruktor erstellen müsst. Wir nutzen hier kein Array, sondern einen Vektor. Beide Klassen sind nahezu identisch. Die Vector-Klasse bietet uns aber Typsicherheit. Wir können hier also nicht Songs und MovieClips zusammen speichern, sondern nur Songs (und davon abgeleitete Klassen).


 

Schritt 27

Jetzt werden wir uns darum kümmern, die Schaltfläche auf die Bühne zu bringen. Wir werden dies innerhalb der completeXMLHandler-Methode tun, um zu verhindern, dass der Benutzer eine Schaltfläche anklickt, bevor die XML-Datei geladen ist.

Dazu erstellen wir erst einmal eine Hilfsmethode, da wir nicht viermal das Gleiche schreiben möchten.

Bilder



Die Methode nennt sich createButtonMC und erwartet zuerst einen MovieClip (also unsere Play-, Pause-, Weiter- und Zurück-Schaltfläche), die x- und y-Position des MovieClips und am Ende eine Funktion, die aufgerufen werden soll, wenn der Benutzer auf die Schaltfläche klickt.

Wir geben dem MC innerhalb dieser Methode also die x- und y-Position. Danach (buttonMode) sagen wir, dass bei einem MouseOver der Mauscursor zu einer Hand werden soll. Der Nutzer erkennt so, dass er diese Schaltfläche anklicken kann. Mit mouseChildren=false sagen wir, dass der MovieClip keine Kinderelemente hat, die mit der Maus interagieren. Dies könnte sonst zu Problemen bei einem MouseOver führen.

Anschließend sagen wir dem MovieClip, dass er den Frame mit dem Namen "Out" anzeigen soll, den wir in den Schaltflächen festgelegt haben. Anschließend erstellen wir die EventListener für den MovieClip und fügen den MovieClip der Bühne hinzu.


 

Schritt 28

Nun erstellen wir die fünf EventListener, die wir brauchen werden.

Bilder



Zuerst die MouseOver- und MouseOut-Handler. Hier sagen wir, dass der Frame "out" bzw. "over" angezeigt werden soll.

Die Methode PlayPauseHandler wird aufgerufen, wenn der Nutzer auf die Play- bzw. Pause-Schaltfläche klickt. Die anderen beiden Methoden, wenn der Nutzer den vorherigen oder den nächsten Song hören möchte.


 

Schritt 29

Jetzt werden wir uns um die Schaltflächen direkt kümmern.

Bilder



 
Wir rufen also für jede Schaltfläche die Methode createButtonMC auf und geben die Parameter mit. Zuerst die Schaltfläche, die wir auf die Bühne legen möchten, dann die Position und den Clickhandler.

Die Play- bzw. Pause-Schaltfläche werden wir mittig am unteren Rand positionieren, die Zurück-Schaltfläche links und die Weiter-Schaltfläche rechts.

Am Ende sagen wir der Pause-Schaltfläche, dass sie nicht sichtbar sein soll, da aktuell noch kein Song abgespielt wird.


Schritt 30

Wenn ihr jetzt die Flashapplikation testet, werden ihr zum ersten Mal die drei Schaltflächen sehen und austesten können, ob die MouseOver- und MouseOut-Handler funktionieren (was sie sollten).

Bilder



 

Schritt 31

Um fortzufahren, fügt die restlichen Variablen der Klasse AudioPlayer hinzu.

Bilder



Wir erstellen also ein Textfeld (txt), das den Interpreten und Titel beherbergt, und ein Textfeld (timer_txt), das die aktuelle Position und Länge des Songs anzeigt.

Dann erstellen wir einen Sound und einen SoundChannel, die wir nutzen, um den Sound zu hören.

Mit soundPosition speichern wir die aktuelle Position des Sounds, wenn der Nutzer auf Pause klickt. Flash bietet aktuell keine Möglichkeit, einfach zwischen Pause und Play eines Songs zu wechseln, wie es bei Videos der Fall ist.

Anschließend erstellen wir einen Timer, der alle 1000 Millisekunden die neue, aktualisierte Position des Songs anzeigt.

Die Variable txtX dient nur der Position des Textfeldes zur Anzeige des Interpreten und Titels. Mit der Variable isPlaying speichern wir, ob ein Song gerade abgespielt wird oder pausiert.

Um zu wissen, welcher Song gerade der aktuelle ist, nutzen wir die Variable indexOfPlayedSong, in der wir den Index speichern, welcher Song aus dem songArray aktuell angezeigt bzw. abgespielt wird.


 

Schritt 32

Anschließend erstellen wir im Konstruktor ein neues Timer-Objekt und fügen diesem gleich einen EventListener hinzu. Dieser besagt, dass er alle 1000 Millisekunden die Methode updateTimer aufrufen soll.

Bilder



 

Schritt 33

Dann erstellen wir die Timer-Methode.

Bilder



In dieser Methode fragen wir die aktuelle Position des Songs (Zeile 106) und die Länge des Songs (Zeile 108+109) ab. Daraus berechnen wir dann Minuten und Sekunden und fügen das Ergebnis dem timer_txt-Textfeld hinzu.

Ich gehe hier nicht direkt auf die Berechnung ein, aber ich gebe den Hinweis, dass die Position und Länge des Songs in Millisekunden angegeben werden. Wir müssen also erst durch 1000 teilen, um Sekunden zu bekommen. Daraus berechnen wir dann Minute und Sekunde.


 

Schritt 34

Befüllen wir nun nacheinander die restlichen Methoden. Zuerst nextHandler und backHandler:

Bilder



Beim backHandler reduzieren wir indexOfPlayedSong um eins, um den vorherigen Song zu bekommen. Sollte dieser Wert negativ sein, setzen wir ihn auf die Länge des songArrays minus 1. Minus 1 deswegen, weil in der Informatik bei 0 angefangen wird. Der erste Song ist bei Index 0, der letzte bei der Länge -1.

 
Beim nextHandler gehen wir ähnlich vor. Diesmal erhöhen wir indexOfPlayedSong um eins. Sollte dieser die Länge des Arrays minus 1 erreichen, so setzen wir ihn auf 0. Möchtet ihr nicht, dass man nach dem letzten Song weiterschalten kann und so bei Song 1 wieder ankommt, müsst ihr in beiden Methoden die if-Abfrage verändern.

Ihr müsst die eine Anweisung innerhalb der if-Abfrage für backHandler so austauschen:

this.indexOfPlayedSong++;

return;

Für den nextHandler lauten die zwei Anweisungen (anstatt der vorherigen einen) nun:

this.indexOfPlayedSong--;

return;


 

Schritt 35

Jetzt erstellen wir die showNext-Methode, die in den zwei vorherigen Methoden erwähnt wurde.

Bilder



Zuerst setzen wir den Sound auf null. Dies müssen wir deswegen tun, da sich der aktuelle Sound ja geändert hat. Wir möchten ja nun den neuen Song hören. Dann aktualisieren wir die Anzeige des Interpreten und Titels.

Dazu holen wir uns den aktuellen Song aus dem SongArray und rufen jeweils die get-Methoden für Interpreten und Titel auf. Zwischen die beiden Texte kommen noch ein paar Leerzeichen und ein Bindestrich.

Anschließend setzen wir die Breite des Textfeldes (width) auf die Textbreite (textWidth). Wir geben dazu noch +5 hinzu, damit wir sicher sein können, dass der Text nicht abgeschnitten wird.

Sollte die Breite des Textes größer sein, als die Anzeige es zulässt, so werden wir das Textfeld animieren und fügen dementsprechend einen EventListener hinzu. Sollte die Breite im Rahmen liegen, so löschen wir den EventListener und positionieren das Textfeld dort, wo es hingehört.

Sollte die Variable isPlaying wahr (true) sein, so wird der neue Song abgespielt, andernfalls nicht. Dann muss man erst die Play-/Pause-Schaltfläche anklicken.

 

Schritt 36

Kommen wir nun zur playSong-Methode.

Bilder



 
Sollte es ein soundChannel-Objekt geben, so stoppen wir ihn zuerst, sodass der alte Sound aufhört. Zudem beenden wir das Laden des Songs mit sound.close(). Dabei kann es passieren, dass eine Exception fliegt, so müssen wir diesen Aufruf in einem try-catch-Block einschließen.

Nun erstellen wir ein neues SoundObjekt. Dazu holen wir uns aus dem songArray den aktuellen Song und davon die URL zum Song. Diese geben wir dann einem URLRequest-Objekt mit, welches uns als Konstruktorparameter für das Sound-Objekt dient.

Ein neues SoundChannel-Objekt, welches zum Abspielen des Songs dient, bekommen wir dadurch, dass wir die song.play()-Methode aufrufen. Anschließen fügen wir dem SoundChannel-Objekt ein EventListener hinzu, der uns benachrichtigt, wenn der Song zu Ende ist. Dann wird automatisch der nextHandler aufgerufen.

Am Ende wird der Timer gestartet, der alle 1000 Millisekunden die updateTimer-Methode aufruft und die aktuelle Zeit des Songs anzeigt.


 

Schritt 37

Kommen wir jetzt zur animateTxt-Methode, die in der Methode showNextSong aufgetreten ist.

Bilder



Dies ist nur eine kleine Methode und animiert den Text von rechts nach links. Sobald der Text links aus dem Bild ist, wird die Position neu gesetzt, und zwar so, dass er nun rechts außerhalb des Bildes ist. Durch die x-Verschiebung läuft er von rechts wieder ins Bild.


 

Schritt 38

Jetzt fügen wir der playPauseHandler-Methode ihren Inhalt hinzu.

Bilder



Zuerst kehren wir den Wert der Variablen isPlaying um. Aus true wird also false, aus false wird true.

Sollte isPlaying nun true sein, d.h., der Song soll abgespielt werden, dann verstecken wir die Play-Schaltfläche und machen die Pause-Schaltfläche sichtbar. Anschließend starten wir den Timer, der die Zeit anzeigt. Sollte ein Sound schon existieren, weil wir vorher schon einmal den Song passiert haben, dann wird dieser Song angespielt.

Da, wie in Schritt 31 erwähnt, bei Sound keine Methode vorhanden ist, die zwischen Abspielen und Pause hin- und herwechselt, müssen wir selbst dafür Sorge tragen, dass der Song an der richtigen Stelle abgespielt wird. Dazu haben wir die Position gespeichert, an der wir den Song pausiert haben.

Sollte es aber kein Sound-Objekt gegeben haben, so wird die play-Methode aufgerufen, um den Song abzuspielen.

Sollte isPlaying false sein, dann wird die Play-Schaltfläche sichtbar und die Pause-Schaltfläche unsichtbar gemacht. Wir speichern die aktuelle Position des Sounds und stoppen den Sound. Er soll jetzt ja nicht mehr abgespielt werden. song.close() rufen wir hier nicht auf, da der Song ruhig im Hintergrund weitergeladen werden kann. Zudem stoppen wir hier den Timer, da sich die Zeit ja nicht verändern wird, während der Song pausiert.


 

Schritt 39

Nun müssen wir noch die zwei Textfelder und die Maske erstellen, die wir teilweise schon in den vorherigen Methoden genutzt haben. Die folgenden Codezeilen müsst ihr in der completeXMLHandler-Methode hinzufügen.

Bilder



Zuerst erstellen wir eine Maske für das Interpreten-Textfeld. Da diese ja von rechts nach links läuft und wir einen Rand haben, an dem das Textfeld nicht zu sehen sein soll, brauchen wir diese.

Wir erstellen also einen MovieClip, positionieren ihn, geben diesem eine rote Füllung und zeichnen ein Rechteck. Dieses ist so groß wie die Bühnenbreite abzüglich des Randes, den wir in der Variablen txtX gespeichert haben. Mit der Methode endFill sagen wir dem MovieClip, dass wir fertig sind mit dem Zeichnen. Wir fügen die Maske nun der Bühne hinzu. Damit sie zur Maske wird, müssen wir dem Textfeld dies sagen, was wir erst im nächsten Schritt machen werden.

Vorher werden wir an der gleichen Stelle wie die Maske einen weiteren MovieClip erstellen, der als Umrandung des sichtbaren Teils des Textfeldes dient. Die Klasse TextField hat zwar eine Eigenschaft namens border, da wir die Position des Textfeldes aber animieren, können wir diese nicht nutzen. Wenn ihr keine Umrandung haben möchtet, so löscht diese sieben Zeilen.


 

Schritt 40

Der letzte Schritt befasst sich mit dem Erstellen der zwei Textfelder.

Bilder



 
Wir erstellen ein Textformat für die Textfelder. Dem Format geben wir einen Schriftnamen und eine Schriftgröße.

Anschließend erstellen wir das erste Textfeld, das den Interpreten und den Titel anzeigt. Wir setzen das Standard-Textformat und positionieren das Textfeld. Wenn ihr in einem Textfeld schon Text stehen habt, müsst ihr zudem noch die Methode txt.setTextFormat(txtFormat) aufrufen, ansonsten werdet ihr die Änderungen des Textformates nicht sehen. Da wir hier aber noch keinen Text haben, brauchen wir es in unserem Fall nicht zu tun.

Nun geben wir dem Textfeld die gewünschte Höhe und sagen dann dem Textfeld, dass es ein Masken-Objekt haben soll, welches mask_mc ist.

Dann setzen wir die Breite des Textfeldes und deaktivieren die Interaktion mit der Maus, indem wir die Eigenschaft mouseEnabled auf false setzen. Standardmäßig lautet sie true.

Nun fügen wir das Textfeld der Bühne hinzu.

Da das Textfeld für die Anzeige der Zeit ein anderes Textformat nutzt, editieren wir es. Zuerst setzen wir die Größe und sagen, dass der Text mittig ausgerichtet werden soll.

Dann erstellen wir das timer_txt-Textfeld und setzen das Standard-Textformat. Wir positionieren das Textfeld unter das vorherige Textfeld und setzen die Breite und Höhe. Wir deaktivieren hierfür ebenfalls die Interaktion mit der Maus und fügen das Textfeld der Bühne hinzu.

Damit gleich am Anfang auch ein Interpret und Titel in den Textfeld stehen, rufen wir die Methode showNextSong auf, die das für uns macht.


Schritt 41

Nun habt ihr euren eigenen AudioPlayer erstellt. Ihr könnt gerne Kommentare hinterlassen oder Hinweise und Anregungen zur Verbesserung geben.



DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von dmtw2107
  • 14.11.2013 - 08:13

danke für das tolle tutorial

Portrait von Elbenzwilling
  • 22.02.2013 - 11:21

Vielen Dank für das Tutorial.

Portrait von edaegelm
  • 21.02.2013 - 08:56

Sehr gute Anleitung ... THX

Portrait von raschid67
  • 20.02.2013 - 15:28

Vielen Dank, war sehr informativ!

Portrait von MicroSmurf
Portrait von MaoMao
  • 20.02.2013 - 11:33

Für mich Neuland, vielen Dank für das Tutorial.

Portrait von kisusuli
  • 20.02.2013 - 11:29

ausführlich und gut erklärt, danke!

x
×
×