Animation und Interaktion mit Flash - eine Kurzübersicht

Zusammengestellt von Dipl.-Inform. Siegfried Wagner (Februar 2006)

Zum Erstellen von Flash-Animationen eignen sich Objekte aus Vorlagen (Zeichnungen, Fotos, eingescannte Bilder, etc.) und in Flash generierte Objekte, sogenannte Vektorgrafiken. Diese werden auf einer Bühne platziert und können über die Zeit verändert werden. Dazu besitzt Flash eine Zeitleiste, in die pro Zeiteinheit verschiedene Bilder (genannt Frames) gesetzt werden können. Spezielle Schlüsselbilder (Keyframes) definieren dabei Frames mit markanten Veränderungen. Bilder zwischen zwei Schlüsselbildern können in bestimmten Fällen interpoliert und damit automatisch generiert werden. In so einem Fall spricht man von einem Tween (von „in between“ - der Begriff stammt aus der Animationstechnik für Trickfilme). Es gibt zwei grundlegende Arten von Tweens in Flash: Den Bewegungstween und den Formtween.
Soll eine Animation nicht einfach nur abgespielt werden (entsprechend der gewählten Geschwindigkeit/Framerate), so können mit Hilfe der in Flash integrierten Programmiersprache ActionScript ereignisbehandelnde Aktionen und damit auch Interaktionsmöglichkeiten hinzugefügt werden. Solche Ereignisse können z.B. ein Mausklick, ein Überfahren eines Objektes mit der Maus oder auch Drag&Drop sein. Die Aktionen können z.B. Steuerungen des Abspielverhaltens in der Zeitleiste aber auch die Veränderung von Objektpositionen und -eigenschaften sein.

a) Einrichten der Bühne:
Im Eigenschaftsinspektor bei ausgewählter Bühne (Klick auf leere Bühne), lassen sich:
  • Größe bestimmen, z.B. 550px x 400px,
  • Framerate einstellen, z.B. 25 Bilder pro Sekunde (Frames per Seconds = FpS),
  • Hintergrundfarbe wählen.
Es kann auch ein Bild in den Hintergrund gesetzt werden. Dazu muss das Bild importiert und auf der Bühne platziert werden. Alle weiteren Objekte sollten dann auf neuen Ebenen darüber platziert werden.

b) Zeichnen bzw. Platzieren der Objekte:
  • Ebenenkonzept berücksichtigen! D.h. einzeln zu animierende Teile immer auf eigene Ebenen setzen! Dabei trotzdem darauf achten, nicht mehr Ebenen zu verwenden, als unbedingt nötig.
  • Objekte in höheren Ebenen können Objekte in darunterliegenden Ebenen verdecken. Es gibt aber auch die Maskenebene, bei der der ausgefüllte Bereich (z.B. eines Objektes, das sich auch in einer Animation verändert) den sichtbaren Bereich für die darunterliegenden Ebenen bestimmt.
  • Komplexe Objekte mit zusammenhängenden Teilen und eigenen Animationen in eigene Movieclip Symbole setzen. Dazu zunächst ein neues Symbol vom Typ Movieclip einfügen und in diesem das Objekt erstellen und animieren. Der Movieclip erscheint dann in der Bibliothek (wenn nicht sichtbar: Strg+L) und kann aus dieser auf die Hauptbühne gezogen werden. Es kann auch ein leerer Movieclip zunächst auf die Bühne gezogen werden und dann mit Doppelklick darauf bearbeitet werden. Dies bietet den Vorteil, das man die restliche Bühne noch ausgegraut sehen kann.
Achtung: Immer darauf achten, auf welcher Bühne (Hauptszene oder Unteranimation) man sich gerade befindet!

c) Animationen (Form- oder Bewegungstweens) erstellen:
  • Formtween: Form (nicht Größe!) oder Farbe verändert sich über die Zeit (-> nur möglich auf nicht gruppierten Objekten, d.h. nicht auf Symbolen, aber innerhalb von Symbolen!)
  • Bewegungstween: Größe, Drehung, Position (auch an einem Bewegungspfad ausrichtbar!) oder Farbe verändert sich über die Zeit (-> nur möglich auf gruppierten Objekten, d.h. auf Symbolen). Achtung: Alle Verformungen mittels des Verformungswerkzeuges gehören auch zum Bewegungstween!
  • Tween erstellen: Zwei Schlüsselbilder, eines für die Ausgangs- und eines für die Endposition, an gewünschter Stelle in der Zeitleiste erstellen. Dann ein ein beliebiges Bild dazwischen auswählen und im Eigenschaftsinspektor den gewünschten Tween auswählen.
  • Kann ein (Bewegungs-)Tween nicht erstellt werden, weil die Objekte nicht zu einem Symbol zusammengefasst sind, kann dies auch nachträglich erfolgen: Dazu zunächst entsprechende Objekte auswählen und dann Umwandeln in Symbol Movieclip (F8) und einen Namen dafür bestimmen.
  • Soll ein Bewegungstween eine nicht geradlinige Bewegung durchführen, so kann man mittels eines Bewegungspfades Symbole auf diesem Pfad entlang bewegen lassen. Zu beachten gilt dabei, dass in den jeweiligen Schlüsselbildern das Symbol auch an den Bewegungspfad gebunden ist (evtl. Hilfswerkzeuge wie Magneten dafür aktivieren).

Hinweis: Ein Movieclip kann auch weitere Movieclips (Symbole) enthalten (Verschachtelung)! Daher am besten grundsätzlich jede (Teil-)Animation wieder in einen eigenen untergeordneten Movieclip stecken. Dabei aber darauf achten, dass die Verschachtelung insgesamt nicht zu tief wird.
Vom Gebrauch der Szenenunterstützung von Flash ist abzuraten! Stattdessen empfielt es sich, die geplanten Szenen als eigene Movieclips zu erstellen und in der Hauptszene die Szenenwechsel durch entsprechende Abfolge dieser Clips zu realisieren.

Tipp: Mit der Kopierfunktion aus dem Kontextmenü in der Zeitleiste lassen sich auch mehrere Frames auf mehreren ausgewählten Ebenen kopieren. So kann z.B. ein neuer leerer Movieclip erstellt werden und alle Ebenen in diesen hineinkopiert werden. Auf diese Weise kann auch die Gesamtszene in die Bibliothek gebracht werden und damit ein Austausch (zwischen verschiedenen Rechnern z.B.) ermöglicht werden.

Achtung: Bitte darauf achten, was alles in die Bibliothek importiert und abgelegt wird, da eine zu große Bibliothek zuviel Speicher benötigt und damit den Rechner zu sehr beanspruchen und zu Instabilitäten im Programmablauf führen kann! Beim Import von Grafiken bitte bereits vorher die Auflösung reduzieren und die Grafik auf den benötigten Ausschnitt beschränken. (Keine Photoshop-Dateien importieren!)

d) Gesamtzusammenstellung:
  • Es gibt keine Patentlösung für das richtige Vorgehen bei komplexen Animationen, die aus vielen Teilanimationen oder mehreren Szenen bestehen. Eine Möglichkeit, die hier vorgestellt werden soll, ist zunächst einfach auf der Hauptbühne Teile zu gestalten und zu animieren.
  • Durch die Verwendung der Kopierfunktion (siehe oben) können ganze Teilanimationen dann auch nachträglich in neue Symbole verschoben werden. Aus der Zeitleiste der Hauptbühne sind diese entsprechend wieder zu löschen und als Symbol mit der gesamten Teilanimation neu zu plazieren.
  • Besonders im Hinblick auf interaktive Steuerung und unabhängiges Abspielverhalten der einzelnen Teilanimationen ist darauf zu achten, dass diese nicht in verschiedenen Ebenen sondern immer in Unteranimationen (also eigenen Symbolen) ablaufen. Animationen, die in verschiedenen Ebenen übereinander liegen, laufen immer parallel ab und können nicht getrennt gesteuert werden!
  • Idealerweise hat man zum Schluss auf der Zeitleiste letztlich nur noch ein paar wenige einzelne Bilder, die z.B. verschiedene Szenen beinhalten. Der Wechsel von einer Szene zur nächsten wird dann durch ActionScript gesteuert.

Tipp: Movieclips (Symbole) können (auch mehrmals) aus der Bibliothek auf die Bühne gezogen werden. Ein Symbol auf einer Bühne wird Instanz genannt. Für jede dieser Instanzen sollte im Eigenschaftsfenster ein Name festgelegt werden, damit sie später von ActionScript angesprochen werden können (siehe weiter unten).

e) Interaktion hinzufügen -> ActionScript-Programmierung
ActionScript: ...ist eine in Flash integrierte Programmiersprache (ähnlich JavaScript), die unter anderem ermöglicht, auf Ereignisse zu reagieren und die Zeitleistensteuerung zu beeinflussen, sowie Flash-Objekte zu manipulieren, als auch zu generieren. Der ActionScript-Code kann dabei an verschiedenen Stellen platziert werden:
  • Direkt an eine Instanz gebunden (Objekt auf Bühne einfach anklicken): Hierbei gilt der Code nur für diese eine Instanz. Zu beachten ist dabei, dass eine andere Syntax als sonst verwendet werden muss. Von dieser Variante ist im allgemeinen abzuraten, da dies zu erhöhter Unübersichtlichkeit und möglichen Inkonsistenzen beitragen kann.
  • In einem Frame auf einer Ebene der Zeitleiste: In der Regel sollte dies im 1.Frame auf einer eigenen neuen Ebene mit einem Namen wie z.B. "actions" erfolgen, ausser natürlich bei Änderungen die zu einem späteren Zeitpunkt ihre Anwendung finden sollen.
  • Um aus dem Code in der Zeitleiste eine bestimmte Instanz ansprechen zu können, die auf der zugehörigen Bühne platziert wurde, wird ihr Name (Achtung: Nicht der Name des Symbols/Movieclips, sondern der vergebene Instanzname -> Eigenschaftsinspektor bei angeklicktem Objekt!) verwendet.
  • Instanzenunabhängiger Code wird generell in der Zeitleiste (am besten in der Hauptszene) platziert.
  • Soll ein Code für alle Instanzen eines Symbols gelten, so ist dieser in der Zeitleiste des Symbols in der Bibliothek (Doppelklick bei ausgewähltem Symbol im Bibliothek-Fenster) zu platzieren.
  • Es können auch externe ActionScript-Klassen eingebunden werden, aber darauf soll hier nicht eingegangen werden.

Allgemeine Hinweise:
Das Prinzip der Programmierung in ActionScript beruht auf dem objektorientierten Ansatz, d.h. jede Funktion wird auf einem Objekt ausgeführt, das zum Aufruf der Funktion vorangestellt und von der Funktion mit einem Punkt „.“ getrennt wird, also z.B. mc1.play();
Handelt es sich bei dem Objekt um das aktuelle Objekt, so gibt es dafür das Schlüsselwort this oder es kann auch weggelassen werden, also z.B. this.play(); oder einfach nur play();
Einem Funktionsaufruf folgen i.d.R. runde Klammern „()“, in denen in manchen Fällen noch Parameter übergeben werden, aber auch wenn diese nicht vorhanden sind, muss trotzdem ein leeres Klammernpaar geschrieben werden.
Geschweifte Klammern „{}“ bilden einen Block, d.h. alle Anweisungen, die in diesem Block hintereinander stehen, werden hier hintereinander ausgeführt.
Getrennt werden Anweisungen grundsätzlich durch einen Strichpunkt „;“, den man auch ohne Anweisungsabfolgen immer an das Ende jeder Anweisung setzen sollte.

Beispiele für die Nutzung von ActionScript:
Beispiel 1:
Auf der Bühne der Hauptszene befinden sich zwei Movieclip-Instanzen mit den Instanznamen mc1 und mc2. Beide Animationen sollen zunächst nicht von selbst starten.
mc1 soll beim Überfahren der Maus starten und beim Verlassen wieder stoppen.
mc2 soll durch Anklicken starten und nur einmal abspielen.
Dazu wird in der Zeitleiste der Hauptszene in einer "actions"-Ebene im ersten Frame folgender Code platziert:

mc1.stop();
mc2.stop();
mc1.onRollOver = function () { mc1.play(); }
mc1.onRollOut = function() { mc1.stop(); }
mc2.onPress = function () { mc2.play(); }

Jetzt spielt mc2 aber noch unendlich ab, sobald es einmal angeklickt wurde. Damit dies nicht mehr so ist, muss in einer "actions"-Ebene in den letzten Frame der Animation mc2 die ActionScript-Anweisung stop(); gesetzt werden (Achtung: leeres Schlüsselbild dafür einfügen!). Hier darf nicht der Instanzname mc2 verwendet werden, d.h. kein mc2.stop(), da innerhalb des Symbols der Name nicht verfügbar ist!

Die Animation von mc1 beginnt bei diesem Beispiel immer da, wo sie zuletzt gestoppt hatte. Soll sie stattdessen jedes Mal von Anfang beginnen, so ist das Kommando mc1.play(); durch ein mc.gotoAndPlay(1); zu ersetzen.

Würden bei diesem Beispiel mehrere Instanzen dieser Movieclip-Symbole aus der Bibliothek auf die Bühne gezogen, so hätten die neuen Instanzen nicht dieses interaktive Verhalten, da der Code sich nur auf die Instanzen mit den Namen mc1 und mc2 bezieht. Einzige Ausnahme: Die stop(); Anweisung, die direkt im Symbol mc2 platziert wurde, gilt für alle Instanzen dieser Animation, d.h. alle spielen jeweils nur einmal ab.

Hinweis: Es ist unbedingt darauf zu achten, dass Instanznamen für Objekte auf der Bühne bereits in einem Frame vergeben werden, der vor dem Frame oder im gleichen Frame des zugehörigen Codes liegt, sonst kann die Referenzierung durch den ActionScript-Code nicht richtig funktionieren. Ausserdem kann es passieren, dass eine Instanz in einem späteren Frame überschrieben wird und daher nicht mehr den Namen trägt. Hier muss dann der Instanzname erneut vergeben werden.

Beispiel 2:
Eine weiterer Movieclip aus der Bibliothek beinhaltet eine Animation, dessen Instanzen auf der Bühne erst beim Anklicken starten sollen und beim Loslassen wieder stoppen. Gleichzeitig soll das Objekt per Drag&Drop verschiebbar sein. Dazu wird auf die Ansicht des Movieclip-Symbols aus der Bibliothek gewechselt (nicht Hauptszene!) und in die Zeitleiste in einer "actions"-Ebene im ersten Frame folgender Code platziert:

stop();
onPress = function() { play(); startDrag(this); }
onRelease = function() { stop(); stopDrag(); }
onReleaseOutside = onRelease;

Hier werden den einzelnen Kommandos nun keine Instanznamen vorangestellt (weil wir uns hier innerhalb des Symbols befinden). Die letzte Zeile bewirkt lediglich, dass auch bei einem Loslassen der Maustaste, wenn die Maus sich nicht mehr über dem Objekt befindet (da dieses sich durch die Animation z.B. entsprechend verändert hat), dann trotzdem das gleiche ausgeführt wird, wie bei einem Loslassen über dem Objekt.

Weitere Hinweise:
Weiter oben wurde bereits erwähnt, dass Movieclips/Symbole verschachtelt sein können. Daher bietet ActionScript eine Möglichkeit auch verschachtelte Instanzen über ihren Namen anzusprechen. Befindet sich z.B. auf der Gesamtszene ein Symbol "wueste", das ein Symbol "sand" enthält, welches wiederum eine "palme" enthält, so kann diese Palme auch von Code in der Zeitleiste der Gesamtszene gesteuert werden:
wueste.sand.palme.stop();

Steht der Code, der die Palme steuern möchte, nicht in der Zeitleiste der Gesamtszene, sondern in irgendeinem anderen Movieclip/Symbol, so stellt man dieser Pfadangabe einfach noch ein _root voran:
_root.wueste.sand.palme.stop();

Alternativ können Instanzen auch über relative Pfadangaben referenziert werden. Wenn z.B. eine Instanz die Zeitleiste der Bühne steuern möchte, in der sich die Instanz befindet, so muss diese übergeordnete Zeitleiste mit dem Pfadpräfix _parent angesprochen werden:
_parent.play();

Beispiel 3: Die Gesamtszene enthält eine Instanz mcOuter eines Movieclips, der selbst wiederum einen Movieclip mcInner enthält. Nun soll mcOuter zunächst nicht abspielen, sondern erst warten bis mcInner einmal durchgelaufen ist und dann starten. Dazu wird in der Zeitleiste von mcOuter in der "actions"-Ebene im 1.Frame ein stop(); platziert. In der Zeitleiste von mcInner wird im letzten Frame (Achtung: leeres Schlüsselbild einfügen!) in der "actions"-Ebene der folgende Code platziert:
stop();
_parent.play();

Hinweis: ActionScript bietet viele weitere Elemente einer typischen Programmiersprache, wie auch Variablen, bedingte Anweisungen und Schleifenkonstrukte.
Variablen werden in der Regel als globale Variablen (d.h. im ActionScript der Hauptszene) definiert. Sie können dann in allen Instanzen mit _root.variablenname angesprochen werden. Lokale Variablen gelten für die jeweilige Instanz (wenn ausserhalb irgendwelcher Blöcke definiert) oder nur für einen einzelnen Block (Schleife, Bedingung, …).

Weitere Beispiele für ActionScript-Code:

a) Mauszeiger durch eigenes Objekt ersetzen:
Angenommen der Movieclip maus soll von Anfang an als neuer Mauszeiger dienen. Dazu bindet man den Movieclip maus einfach wie beim Drag&Drop an die Maus und macht den originalen Mauszeiger einfach unsichtbar.

onLoad = function() {
   startDrag(maus, true);
   Mouse.hide();
}

Das onLoad bewirkt, dass die Funktion nur einmal beim Laden der gesamten Animation ausgeführt wird. Und der zweite Parameter bei startDrag, das true bewirkt, dass unsere maus direkt zentriert an den originalen (jetzt unsichtbaren) Mauszeiger positioniert wird und sich nicht irgendwo entfernt mitbewegt.

b) onEnterFrame:
Um einen Movieclip während dem Abspielen seiner Animation automatisch in der Position zu verschieben, fügt man z.B. folgenden Code in der „actions“-Ebene des Movieclips hinzu:

onEnterFrame = function() {
   if (_root.mc_move) {
      this._x += 10;
      this._y += 4;
   }
}

Dabei ist mc_move eine (globale) Variable, die in der ActionScript-Ebene der Gesamtszene definiert wird und als Flag dient, ob eine Bewegung stattfinden soll (mc_move = true) oder nicht (mc_move = false).
onEnterFrame wird bei jedem Framewechsel aufgerufen und ist daher für jede Art von Code geeignet, der permanent durchgeführt werden soll.

Mit onEnterFrame kann man zum Beispiel auch sehr einfach erreichen, dass eine Animation am Ende rückwärts abgespielt wird.
Dazu einfach stop(); onEnterFrame = prevFrame; in der "actions"-Ebene der Animation in den letzten Frame setzen. Im ersten Frame kann dann ein onEnterFrame = nextFrame; stehen, damit die Animation dann am Anfang angekommen nicht stoppt, sondern wieder von vorne abspielt.

c) hitTest:
In Verbindung mit Drag&Drop möchte man vielleicht auch ein Objekt auf ein anderes Objekt legen und dies erkennen. Oder Objekte bewegen sich automatisch und Kollisionen sollen erkannt werden. Dafür gibt es in ActionScript den hitTest:
Zwei Symbole mcBall und mcTor liegen auf der Hauptbühne und besitzen die Instanznamen ball und tor. Die Aufgabe ist bekannt: „das Runde muss in das Eckige“
Dazu kommt folgender Code in die "actions"-Ebene der Zeitleiste der Gesamtszene:

ball.onPress = function() { startDrag(ball); }
ball.onRelease = function() { stopDrag();
                 if (ball.hitTest(tor)) { trace("Treffer!"); }
                 }
ball.onReleaseOutside = onRelease;

Das Kommando trace bewirkt eine Ausgabe in einem Ausgabefenster, sobald der Ball über dem Tor losgelassen wird. (Diese Ausgaben sind vor allem zur Fehlersuche sehr praktisch!)

d) _currentframe:
Einige Variablen sind vordefiniert und können jederzeit einfach abgefragt oder mit anderen Werten versehen werden. Zu diesen gehört auch _currentframe, welche den numerischen Wert des aktuellen Frames des jeweiligen Movieclips zurückgibt. Es gibt dann aber auch z.B. noch _totalframes für die Gesamtanzahl der Frames eines Movieclips.
So könnte man z.B. auch auf oberster Hierarchiestufe (also in der Zeitleiste der Gesamtszene) kontrollieren, dass eine Unteranimation mcInner im letzten Bild stehen bleibt:
mcInner.onEnterFrame = function() {
          if (mcInner._currentframe == mcInner._totalframes) {
            mcInner.stop();
          } }

e) Mitzählen:
An verschiedenen Stellen können Zähler erwünscht sein, die z.B. sicherstellen, dass eine Animation nur 3 Mal abgespielt wird, oder dass z.B. bei einem Drag&Drop genau 5 Objekte in ein Ziel gebracht werden sollen und dann etwas passieren soll. Dafür verwendet man einfach eine Variable beliebigen Namens, der bezeichnenderweise sinnvoll gewählt werden sollte, und initialisiert diese im ersten Frame der zugehörigen Zeitleiste, die der zählenden Animation (in diesem Beispiel mc1) übergeordnet ist:
mc1.myCounter = 0;

In der entsprechenden Animation mc1 wird der Zähler hochgezählt und abgefragt, also schreiben wir in der "actions"-Ebene der Zeitleiste, die zu mc1 gehört:
myCounter++;
if (myCounter > 3) { stop(); }

Einbindung von Sound:

Sound kann auf unterschiedliche Arten in Flash eingebunden werden. Grundsätzlich muss die Tondatei aber zunächst in die Bibliothek importiert werden.
Dann kann sie:
  • ...direkt auf die Bühne (in einer neu angelegten Ebene) gezogen werden. Hier müssen dann noch die Abspieleinstellungen im Eigenschaftsinspektor vorgenommen werden.
    Über die Einstellung Sync wählt man zwischen:
    • Ereignis: Wenn der Ton unabhängig der Frames abgespielt werden soll. Dabei kann auch noch die Wiederholungszahl oder „unendlich“ eingestellt werden.
    • Anfang: Um den aktuellen Frame (muss Schlüsselbild sein!) als Tonanfang zu bestimmen.
    • Stopp: Bestimmt, dass im aktuell ausgewählten Frame (muss Schlüsselbild sein!) der Ton aufhört zu spielen.
    • Stream: Bewirkt ein zu den Frames synchrones Abspielen (man kann den Ton sogar beim schrittweise Durchgehen der Frames mit gedrückter Maustaste hören).
  • ...zur Nutzung durch ActionScript zur Verfügung gestellt werden.
Dazu in der Bibliothek den Sound auswählen, mit der rechten Maustaste „Verknüpfung...“ auswählen und „Export für ActionScript“, und schließlich einen Bezeichner (Namen) eingeben, der dann in ActionScript verwendet werden kann.

Der Code kann dann z.B. in der "actions"-Ebene der Zeitleiste einer Animation so aussehen:
giggle_sound = new Sound(this);
giggle_sound.attachSound(„giggle“);
giggle_sound.start();

„giggle“ ist dabei der Bezeichner der Verknüpfung zum Sound in der Bibliothek.

Achtung: Das Soundobjekt (hier giggle_sound) bezieht sich auf den Movieclip, der bei new Sound() in den Klammern angegeben wurde (hier this, also der aktuelle Movieclip), und auf alle untergeordneten Animationen! Wird die Angabe weggelassen bedeutet dies, das Soundobjekt bezieht sich auf die Hauptbühne und steuert somit den gesamten Sound (und z.B. auch die gesamte Lautstärke aller Sounds, welches mit setVolume möglich ist).

Weitere Hilfe:
…findet man am besten in Flash selbst, vor allem für die ActionScript-Programmierung im ActionScript-Lexikon unter dem jeweiligen Buchstaben, also z.B. M für die Mouse-Funktionen und die Movieclip-Funktionen (also alle Animationen!). Oder man arbeitet sich die unzähligen Beispiele und Tutorials im Internet durch. Einfach mal suchen...


Diese Kurzanleitung ist entstanden durch die Erfahrungen aus mehreren Flash-Blockpraktika in Zusammenarbeit der Medieninformatik und der Kunstpädagogik der LMU München und ist speziell auf die darin aufgetretenen Bedürfnisse abgestimmt. Sie richtet sich an Flash-Einsteiger mit minimalen Programmiererfahrungen, soll aber nur als Ergänzung zu Tutorials und Anleitungen dienen und kann als Kurzreferenz für die praktische Anwendung genutzt werden.

-- SiegfriedWagner - 23 Mar 2006
Topic revision: r1 - 23 Mar 2006, SiegfriedWagner
 
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Medieninformatik-Wiki? Send feedback