ST-Assemblerecke - Shapes und Sprites

Mit der Animation von Shapes und Sprites beschäftigt sich diese ST-Assemblerecke.

Diesmal wollen wir uns dem Thema Animation zuwenden und es umfassend behandeln. Animation bedeutet zunächst einmal nichts anderes, als Bilder auf dem Monitor zu bewegen. Man läßt also beispielsweise eine Figur über den Bildschirm laufen oder ein Gesicht sprechen. Da hierzu meist große Datenmengen im Speicher zu verschieben sind, ist Maschinensprache für die Programmierung fast unerläßlich.

Es gibt mehrere Arten der Animation. Zunächst fällt wohl jedem die einfache aneinandergereihte Anzeige von verschiedenen Grafiken ein. Dabei wird ein Bild nach kurzer Zeit komplett von einem neuen abgelöst, das sich vom ersten leicht unterscheidet. So setzt sich dies weiter fort; es entsteht eine Animation. All dies muß natürlich sehr schnell geschehen, da die Bewegungen sonst ruckartig verlaufen. Eine solche Methode erinnert stark an ein Daumenkino oder an die Bilder, die uns das Fernsehen liefert. Ihr Nachteil liegt natürlich im immensen Speicherbedarf. Jede einzelne Grafik belegt ja 32 KByte. Soll unser „Film“ also fließend ablaufen, benötigen wir mindestens 25 Bilder pro Sekunde, das sind 800 KByte!

Natürlich existieren auch Verfahren zur Kompression derartiger Filme, so z. B. das Delta-Packing. Bei dieser Technik macht man sich zunutze, daß bei einer normalen Animation immer nur einige Ausschnitte der Grafik verändert werden. Man speichert demnach immer nur jene Teile des neuen Bilds, die sich gegenüber dem vorherigen verändert haben. Damit lassen sich dann im günstigsten Fall kurze Filme von bis zu 10 Sekunden Länge im 1MByte-ST unterbringen. Dies bedeutet natürlich, daß dann nichts anderes mehr im Rechner Platz findet.

Wollen Sie also in einem Grafik-Adventure eine kleine Filmsequenz einbauen, müssen Sie mit dieser Technik schon größere Kompromisse eingehen. Entweder verkleinern Sie die Bildgröße auf einen Bruchteil des Gesamtbilds, oder Sie nehmen sehr ruck-artige Bewegungen in Kauf. Aber selbst bei rund einem Achtel der Bildschirmgröße und nur 10 Grafiken pro Sekunde benötigen Sie zwischen 100 und 400 KByte für eine 10-Sekunden-Sequenz. Kleinere Bilder lassen sich nämlich nicht so effektiv kürzen wie größere. Aufgrund der geschilderten Nachteile findet diese Art der Animation auch nur sehr selten Verwendung, es sei denn, Sie wären gerade Videofreak. Als Besitzer eines Videorecorders mit Einzelbildaufnahme haben Sie nämlich die Möglichkeit, beliebig lange Filme zu erstellen, da ja immer nur ein Bild im Rechner zu halten ist. Dieses wird dann vom Recorder aufgenommen. Davon haben Sie aber herzlich wenig, wenn Sie die Animationen in Spiele usw. einbauen wollen.

Deshalb kommen wir nun zur zweiten Methode. Dabei handelt es sich um die Shape- bzw. Sprite-Animation. Eigentlich ist dieses Verfahren dem zuvor genannten, nämlich der Veränderung kleiner Bildschirmausschnitte, recht ähnlich. Hier wird jedoch konsequenter vorgegangen, die animierten Objekte sind vom Hintergrund unabhängig Dies erinnert an die Zeichentrickfilmproduktion. Dort werden ja die Folien für eine Figur auch über den Hintergrund gelegt und auf ihm verschoben. Es muß also immer nur die sich bewegende Figur neu gezeichnet werden und nicht der gesamte Bildausschnitt. So lassen sich im Unterschied zum einfachen Austausch eines beliebigen Ausschnitts auch Figuren animieren, die nicht immer an der gleichen Stelle über den Bildschirm wandern. Wie man ein solches Shape auf dem Monitor erzeugt, wurde bereits in einer früheren Folge der Assemblerecke genau erklärt. Wir wollen uns deshalb nur in den Grundzügen noch einmal damit befassen.

Wenn ein beliebig geformtes Objekt in eine Grafik kopiert werden soll, ohne diese zu zerstören, so sind insgesamt drei Schritte notwendig:

  1. Retten des Hintergrunds an der Stelle, wo später das Objekt erscheinen soll
  2. Kopieren des Objekts in die Grafik
  3. Wiederherstellen des Hintergrunds durch Zurückschreiben des zuvor geretteten Bereichs

Die Punkte 1 und 3 dürften wohl keine Probleme bereiten. Hier ist nur das einfache Kopieren von Speicherbereichen notwendig. Zu beachten ist lediglich, daß normalerweise eine mehr oder weniger lange Pause zwischen Teil 2 und 3 erfolgt, damit das Objekt auch zu sehen ist. Daher lautet die eigentliche Reihenfolge auch zumeist 3., 1., 2.. Zu Punkt 2, dem Kopieren des Objekts, muß allerdings noch einiges geklärt werden.

Dieser Vorgang läßt sich nicht einfach mit MOVE-Befehlen durchführen. Dies käme ja wieder einem Austausch von Grafikblöcken gleich und würde zu einem schwarzen Rechteck rund um das Objekt führen. Deshalb verwenden wir eine OR-Verknüpfung mit dem bestehenden Hintergrund, und zwar nur dort, wo das Objekt später zu sehen ist. Wir verknüpfen zunächst alle seine unsichtbaren Punkte über AND mit dem Hintergrund, wodurch wir dort alle Punkte gelöscht haben, an denen das Objekt zu sehen ist. Erst jetzt verknüpfen wir es mit OR in die Grafik. Wie dies genau vor sich geht, können Sie dem Demo-Listing entnehmen. Es enthält eine Shape-Routine für 16farbige 16Pixel-Shapes. Hier sehen Sie ebenfalls, wie das Shape um 0 bis 15 Pixel innerhalb eines Grafikblocks rotiert wird, damit es auch an jeder möglichen Bildschirmposition erscheinen kann..Nun bedeutet ein über den Bildschirm bewegtes Objekt aber noch keine Animation. Dies ist erst dann der Fall, wenn es auch in mehreren Phasen erscheint und eine Figur z.B. läuft, indem sich ihre Beine bewegen. Dies läßt sich dadurch erreichen, daß wir den Zeiger, der auf das darzustellende Shape weist, austauschen. Wenn Sie also einen Computer-Zeichentrickfilm erstellen möchten, müssen Sie nur für jede Figur ein „Drehbuch“ schreiben, in dem alle Koordinaten und alle Animationsphasen eingetragen sind. Dies geschieht in Form einer Tabelle, die für jeden Bildaufbau die dazugehörigen Koordinaten und den Zeiger für die darzustellende Animationsphase enthält. So lassen sich mit relativ wenig Speicheraufwand auch längere Filme erzeugen, da sich ja viele Bewegungen einer Figur wiederholen und daher auch keinen weiteren Speicherplatz belegen.

Wahrscheinlich wollen Sie Ihre Animationen in einem Action-Spiel o. ä. einsetzen. Deshalb soll jetzt noch genauer auf die Erzeugung von nicht zuvor festgelegten Animationen eingegangen werden. Dies bedeutet nichts anderes, als daß wir eine Figur mit dem Joystick über den Bildschirm steuern wollen. Ihr Weg ist ja ebenso wie die Reihenfolge der Bewegungen vorher nicht bekannt und kann vom User beeinflußt werden.

In unserem Beispiel wollen wir eine Figur nach links und rechts steuern, wobei ein Schritt aus acht Phasen bestehen soll. Dazu legen wir jeweils eine Liste an, in der die Zeiger auf diese Phasen in der richtigen Reihenfolge stehen. Solange der Joystick in eine der beiden Richtungen gedrückt ist, wird die entsprechende Tabelle abgearbeitet. Dies sollte nun aber nicht so programmiert werden, daß nach jedem Loslassen des Joysticks die Bewegung abrupt endet. Auf diese Weise würde die Figur bei einer erneuten Bewegung ja wieder bei der ersten Phase beginnen, und es entstünde ein Ruck. Aus diesem Grund ist es besser, wenn eine Bewegung nach ihrem Start immer erst zu Ende geführt wird, bevor die nächste Joystick-Abfrage erfolgt. Dann läuft eine Figur zwar nach Loslassen des Joysticks noch ein wenig nach, dafür sind ihre Bewegungen aber auch fließender. Natürlich darf ein Schritt nicht allzu groß sein, da sonst die Steuerung der Figur nicht mehr genau genug erfolgen kann.

Im Beispiel-Listing wird dies einmal genau für den LoRes-Modus demonstriert. Die dort verwandten Animationsphasen sind allerdings leer. Sie müssen also selbst die einzelnen Animationsphasen in die dafür vorgesehenen Bereiche schreiben. Die Shapes haben alle eine Form von 32 Zeilen zu je 16 Pixeln (8 Bytes), die hier hintereinander hineingeschrieben werden. Natürlich soll diese Routine nur als Grundstock für eigene Programme dienen. Sie können z.B. auch andere Bewegungen der Figur zulassen oder mehrere Objekte auf einmal darstellen. Außerdem wird nur mit einem Bildschirm gearbeitet. Dadurch ergibt sich ein Flackern, sobald die Figur in den oberen Bildschirmteil gerät.

Abschließend wollen wir uns nun noch einer weiteren Animationsmethode zuwenden, die eigentlich gar keine ist. Die sogenannte Farbrotation wird beispielsweise im „Neochrome“ Wasserfalldemo angewandt. Hier entsteht durch geschicktes Vertauschen von Farben der Eindruck, daß die Fluten den Wasserfall hinunterstürzen. Bei diesem Verfahren werden immer mehrere Farbregister zyklisch miteinander vertauscht. Es ist also beispielsweise zunächst ein Rad zu zeichnen, in dem mehrere Farben so angeordnet sind, daß sie jeweils einen Sektor ausfüllen. Das Rad besteht dann vielleicht aus acht Sektoren, von denen sieben in Dunkelgrau gezeichnet sind und einer in Weiß. Nun werden die Farbregister so vertauscht, daß der Inhalt des ersten in das zweite Register gelangt usw. Der weiße Sektor wandert jetzt scheinbar rund um das Rad. Setzt man diese Methode geschickt ein, können durch das Vertauschen weniger Bytes ganze Meere zu brodeln beginnen oder Flammen naturgetreu auflodern. Der Nachteil dieses Verfahrens liegt allerdings darin, daß die verwendeten Farbregister nicht mehr für andere Teile Ihrer Grafiken zur Verfügung stehen. (Die Farben würden sonst ja immer wechselnd erscheinen).

Das gesamte Gebiet der Animation ist also sehr mannigfaltig und bietet ungeheuer viele Möglichkeiten. Zuweilen ist auch durch eine Verbindung von mehreren der besprochenen Methoden die beste Wirkung zu erzielen. Der größte Feind aller Animations-Freaks ist aber nach wie vor der nie ausreichende Speicherplatz. Oft erscheint dies als unüberwindbares Hindernis, doch läßt sich auch hier zumeist ein Ausweg finden.

Download "sprites.ass" (5 KB)


Christian Rduch
Aus: Atari-Magazin 01 / 1989, Seite

Links

Copyright-Bestimmungen: siehe Über diese Seite