16-FARBEN-SCROLLING Teil III
Endlich! Diesmal wollen wir das Ding mit
der $ d011- Trickserei hinter uns bringen.
Als Krönung dazu befindet sich der " Bitmap- Manager" auf der Diskette. Dieser
Editor verwaltet Grafik-Areas für die
Routine des dok. Scroll-Source- Codes der
vorigen Ausgabe. Zu Beginn eine kurze
Einführung in das Arbeiten mit diesem
Editor. . .
Mit dem " Bitmap-Manager" lassen sich
Grafik-Backgrounds in einem Format von
100 x 40 Squares gestalten. Ein Square
ist ein Feld der Größe von 2 x2 Cursors.
Insgesamt also eine Area von rund
5 x 4 Screens. Die Squares werden von
einem Grafik-Bild von 40 x 20 Chars
ausgelesen ( z. B. ein normales Koala-Pic
in der Höhe von 20 Chars), womit wir bei 200 verschiedenen Squares wären.
Zu Beginn befindet man sich im Haupt-Menu, in welchem man mit den Cursor-Tasten und Return bestimmte Funktionen
startet. Wenn wir in den Field-Editor
gelangen, gelten folgende Tasten als
funktionstüchtig:
Return,Pfeil links........ins Haupt-Menu Cursor oder Joystick.....Pointer bewegen 1-8........................Square setzen Space oder Feuer........Square #0 setzen F1/F2...................Hintergrundfarbe F7....................in den Page-Editor +,-...................Page 0-31 anwählen shift+clr home...........Area löschen(!) *...................Sprite-Block-pointer (die '*'-Funktion wird später noch genauer erläutert werden...)
Die Squares lassen sich also mit den
Tasten 1-8 setzen, abhängig von der
aktuellen Page. Um nun die Pages zu editieren, gelangen wir mit ' F7' in den
Page-Editor, welcher mit folgenden
Tasten bedient wird:
F7...................in den Field-Editor Cursor oder Joystick.....Pointer bewegen 1-8.............Square in Page schreiben +,-........................Page anwählen
So lassen sich 32 verschiedene Pages erstellen. Beim anwählen der Pages ändert
sich die Rahmenfarbe mit, das heißt, daß jede Page seine bestimmte Farbe anzeigt. Somit ist das Arbeiten im Field-Editor leichter, da in diesem das vollständige Darstellen der 8 Squares einer
Page aus technischen Gründen nicht
möglich ist. Orientierung schafft nur
die Page-Nummer rechts oben und eben
die entsprechende Rahmenfarbe.
NUN GANZ PRAKTISCH:
Wie gestalte ich mein eigenes Demo/ Game?
Zuerst mal wird gemalt. Ein Picture in
der Größe 40 x20 Cursors, welches alle
200 Squares repräsentiert. Abgespeichert
wird im Koala-Format. Nun läßt sich
dieses Bild mit dem " Bitmap-Manager" laden, wonach es in das richtige," redefined" Format gebracht wird ( der Bildschirmrand flackert kurz) .
So, nun kann' s schon mit der Field-Gestaltung losgehen. Zuerst mal die
Pages zusammenstellen. Am Besten die
Squares, die in Verbindung miteinander
stehen ( ganze Grafik-Elemente), in die
gleiche Page bringen. Jetzt zurück in
den Field-Editor und den Background
designen. . .
Hat man sich einmal an das Prinzip mit
den Pages und dem 1-8- Modus gewöhnt, läuft das Gestalten so richtig schnell
und macht Spaß. Vor Allem dann, wenn
man schon weiß, wo bestimmte Squares sind, die man z. B. öfter braucht, was
nach einer gewissen Zeit sowieso entsteht.
Gut, die Area ist abgeschlossen und wir
begeben uns wieder ins Hauptmenu. Dort
speichern wir vorsorgend gleich die
Pages und die gesamte Area ($ c000-$ cfa0) . Beim Wiederbearbeiten einfach
die Grafik, Area und Pages reinladen, und losgeht' S ( die Pages haben also nur
für den Editor Bedeutung) !
Wollen wir ernst machen und den gesamten
Background für ein eigenes Projekt verwenden, dann ist folgende Schrittfolge
anzuwenden:
Zuerst speichern wir die Grafik( Squares) als " redefined Grafics" ab ( Bereich von
$2000 bis $3 f3 f) . Bevor wir nun die
Routine starten ( ich rede vom Sourcecode
der letzten Ausgabe von Kurs Teil 2), laden wir die Area ($ c000) normal und die " redefined Grafic"( gespeichert ab
$2000) nach $ e000 in den Speicher. Wenn
wir jetzt die Routine starten, haben
wir nicht viel Unterschied zum Editor, da die Routine ( vom Sourcecode) dem
Editor ähnlich ist. Aber wir befinden
uns schon mal im Assembler und können
die ganze Sache entscheidend beeinflussen. . .
. . . ab hier ist jeder Programmierer auf
sich selbst angewiesen. Man sollte sich
ein wenig in den Code einarbeiten und
herumexperimentieren. Ein wenig Tips
und Hilfe möchte ich hier aber noch
auflisten:
1 . Im schwarzen, oberen Bereich ( linecrunching) werden 7 Sprites ( Xund
Yexpanded) dargestellt. Die Koordinaten, Blöcke und Farben werden im
Programm initialisiert. Durch gezieltes Ändern ist diese Gestaltung
selbst frei einzurichten ( die Y- Koordinaten müssen allerdings gleichbleiben; Timing!) .
2 . Das Programm arbeitet in einem Hauptund einem Interrupt-Teil. Der Hauptteil wartet immer wieder darauf, ob
neue Zeilen aufgebaut werden müssen.
Im Interrupt werden die Tasten abgefragt, die Softscreenmoving-Routine
aufgerufen sowie ins Linecrunching
verzeigt. Wird nun im Hauptprogramm
gerade eine Cursor-Zeile aufgebaut, wird der Vorgang meist, denn er dauert
eine gewisse Zeit, vom Interrupt
unterbrochen.
Also: Routinen, die alle 1/50 Sekunde
stattfinden müssen, werden einfach in
den Interrupt eingabaut. Dabei ist zu
beachten, daß nicht zuviel Rasterzeit
verbraucht wird, da das Linecrunching
zur bestimmten Rasterzeile unbedingt
stattfinden muß. Wenn die freie Zeit
zuwenig ist, einfach den Raster-IRQ- Einsatz um ein paar Zeilen verfrühen,
und sozusagen vom Hauptoder Aufbau-Programm etwas abzwicken.
3 . Im Sourcecode befindet sich eine
Routine mit dem Namen " SET PIECE" .
Wenn ein Square auf den Bildschirm
gestzt wird, muß sie aufgerufen
werden. Die " set piece"- Routine ist
sehr praktisch: Sie prüft, ob das
Square, welches gesetzt wird, im
sichtbaren Bereich liegt oder nicht.
Wenn ja, wird es in die angezeigte, aktuelle Bitmap geschrieben. Wenn
nicht, dann nur als Byte in der Area
festgehalten, d. h. wenn dorthin
gescrollt wird, wird jenes Square
angezeigt, da' s ja in der Area verankert wurde ( in die Area wird das
Square also auf jeden Fall geschrieben) .
4 . Gescrollt wird, indem man die gewünschten Werte direkt in den Opcode
der Screenmoving-Routine schreibt.
Die Labels heißen " mo1"-" mo4" . Also
um nach oben zu scrollen, den Soft-Wert nach " mo1+1" schreiben und die
Routine Screenmoving aufrufen. Die
Werte können von 0-8 liegen und werden nach jedem Aufruf automatisch
gelöscht.
Zum Schluß möchte ich noch auf einen
kleinen " Hindernis"- Umstand eingehen, welchen ich oben zu Beginn dieses
Kurs-Teiles angesprochen habe. Es geht
um den Sprite-Blockpointer- Bereich, welcher sich im Editor durch die "*"- Taste und im Sourcecode mit der Return-Taste einund ausschalten läßt ( diese
8 nebeneinanderliegenden ( phew!) Cursor-Bytes " flashen" dann) .
Bekanntlich belegen die Blockpointer für
die Sprites die letzten 8 Bytes des
aktuellen Text-Bildschirms. In unserem
Beispiel liegt dieser ab $4400, die
Blockpointer also ab $47 f8 . Gewöhnlich ist dieser Bereich frei verfügbar, da
der Text-Bildschirm nur einen Bereich
von 1000 Bytes braucht ( also bis $47 d7) .
Doch durch das Linecrunching kommt
dieser sonst unsichtbare Bereich auch
zum Vorschein, da der VIC bei der Darstellung des Screens dort fortsetzt, wo
er aufgehört hat ( also bei $47 d8, und
erst nach $47 ff springt er zu $4400 zurück) .
Dies ist auch der Grund, warum beim
Linecrunchen der Bereich auch in X-Richtung versetzt auftaucht, nämlich
genau um diese 24 Bytes/ Cursors!
Um mit diesem Umstand keine " Troubles" zu bekommen, läßt man jene Cursors
einfach leer oder vom Screen-Colour- RAM
unbeeinflußt ( nur $ d800- Farb-RAM!) .
Wenn man auf Sprites über der Scroll-Area verzichtet, stellt sich selbiges
Problem ohnehin nicht.
Mein letzter und vielleicht wichtigster
Tip lautet:
Durchbeißen! Durchbeißen! Durchbeißen!
. . . und NIIIIIEEMALS aufgeben!
(Hannes Sommer,'93)