C 64
Adventure-Grafik

Super-Grafik für Adventures

In diesem Artikel wollen wir wichtige Tips für diejenigen bringen, die ihr Adventure grafisch aufmöbeln wollen. Sie können dann also nicht nur professionelle Text- sondern auch Grafikadventures programmieren.

Wer heute ein außergewöhnlich gutes Adventure schreiben will, muß sich früher oder später die Frage stellen, ob es sinnvoll ist, das Spiel mit Grafik zu versehen oder nicht. Letztendlich ist diese Entscheidung auch darüber ausschlaggebend, ob zirka 8 KByte RAM für eine Bit-Map oder für einen riesigen Wortschatz ausgenutzt werden. Die letzten Abenteuerspiele, die auf den Markt gekommen sind, haben auch eine traurige Tatsache immer wieder bestätigt: Die Spiele, die mit fantastischer Grafik ausgestattet sind, lassen immer am Wortschatz schwer zu wünschen übrig. Ich denke hier zum Beispiel an das Spiel Asylum: Die Grafik ist zwar überwältigend, aber die Spiellust geht spätestens dann verloren, wenn man zum zehntenmal die Antwort »You can not do that« erhalten hat und niemals eine detaillierte Erklärung, warum etwas nicht geht. Unglücklicherweise enthält das Spiel auch noch eine Dia-Show-Funktion, die es ermöglicht, zu Beginn des Spiels alle Bilder anzuschauen. Dadurch wird schließlich auch noch der letzte Funke Spiellust zerstört – nämlich die Überraschung beim Entdecken eines neuen Bildes. Wir wollen uns zunächst jedoch nicht mit Speicherplatzproblemen im Bereich HiRes-Bilder/Wortschatz beschäftigen, sondern vielmehr die folgende Frage klären: Wie macht man fantastische HiRes-Bilder für Grafikadventures?

Jeder von Ihnen hat bestimmt schon einmal mit Malprogrammen wie zum Beispiel Koala Painter oder Paint Magic etc. gearbeitet. Begabte Grafiker kommen damit oft auch zu guten Resultaten. Allerdings ist das »per Hand Zeichnen« unheimlich zeitaufwendig. Zugegeben, es gibt zahlreiche Zeichenprogramme, die das Arbeiten mit Grafiktabletts, Trackball, Joystick, Maus und Lightpen unterstützen, aber alle diese Methoden erfordern unheimliches Geschick zum Zeichnen – und das haben nur sehr wenige Programmierer (zu denen auch ich leider nicht gehöre). Die Lösung allen Übels heißt schließlich: Video Digitizer. Video-Digitizer sind Geräte, mit denen es möglich ist, Bilder von einer Kamera beziehungsweise einem Videogerät in den Speicher eines Computers einzulesen (sprich digitalisieren). Diese Geräte waren bis vor kurzem sehr teuer (zirka 600 Mark), sind jetzt aber schon relativ erschwinglich. Gebrauchtgeräte gibt es schon ab 200 Mark.

Leider ist es mit dem Video-Digitizer allein noch lange nicht getan. Neben einer Computeranlage benötigt man auch noch eine Video-Kamera. Für so eine Schwarzweiß-Kamera muß man dann noch einmal zirka 600 Mark auf den Tisch legen. Es lohnt sich jedoch in den seltensten Fällen, eine solche Kamera zu kaufen, die lediglich zum Arbeiten mit dem Digitizer verwendbar ist.

Eine andere Möglichkeit ist es, einen Videorecorder an den Digitizer anzuschließen. Dies hat jedoch nur dann einen Sinn, wenn der Recorder über ein ausgezeichnetes Standbild verfügt. An einen Videorecorder mit Standbild zu gelangen beziehungsweise sich einen von Freunden auszuleihen, dürfte kein allzu großes Problem sein. Anders die Kamera. Gute Videokameras sind im Moment noch dermaßen teuer, daß sie nur in wenigen Haushalten zu finden sind. Es gibt jedoch zahlreiche Videotheken und Video-Geschäfte, in denen man Kameras (und natürlich auch Recorder) ausleihen kann. Wer Glück hat, findet bestimmt ein Geschäft in dem man eine Videoanlage für weniger als 50 DM ein Wochenende lang ausleihen kann. Alles, was Sie dann noch benötigen, sind Bildvorlagen zum Digitalisieren. Sind die Bilder erst einmal im Computer, ist es ein leichtes, sie nach eigenen Wünschen zu manipulieren, umzufärben und schließlich ins eigene Adventure einzubauen. Man benötigt also noch ein gutes Malprogramm, um die digitalisierten Bilder vernünftig bearbeiten zu können. Leider hat jedes Malprogramm Vorteile und Nachteile – und die Bilder der einzelnen Programme sind natürlich absolut inkompatibel untereinander.

Viele Digitalisierer speichern im Koala-Painter-Format ab. Als Zeichenprogramm würde ich aber Paint Magic empfehlen. Deswegen nun ein kleines Listing zum Verwandeln von Koala- in Paint-Magic-Bilder (Listing 1). Das kurze Listing erklärt sich von selbst.

|
10 rem *******************************
20 rem *   bildumschreibe-routine    *
30 rem *                             *
40 rem *    koala - paint magic      *
50 rem *                             *
55 rem *******************************
60 ifa=1then130
70 print"{clr}{yel}{down}{rvon}  bildumschreiberoutine                 {rvof}"
80 print"  quelldiskette einlegen , dann bild-    {down} kennziffer eingeben !"
90 input"{down}{down}";k$
100 ifk$<"a"ork$>"z"then 50
110 poke 55,0:poke56,96
120 a=1:load"?pic "+k$+"*",8,1
130 :
140 :
150 print"{down}{rvon}  bildumschreiberoutine                 {rvof}"
160 print" zieldisk einlegen , dann gewuenschten   {down}namen eingeben !"
170 input"{down} ";n$
180 open1,8,1,n$+",p,w"
190 print#1,chr$(142);chr$(63);
200 for i=16270to16383:print#1,chr$(0);:next
210 for i=24576to32767:print#1,chr$(peek(i));:next
220 for i=32576to33599:print#1,chr$(peek(i));:next
230 close1
 10 REM ******************************* 
 20 REM *   BILDUMSCHREIBE-ROUTINE    * 
 30 REM *                             * 
 40 REM *    KOALA - PAINT MAGIC      * 
 50 REM *                             * 
 55 REM ******************************* 
 60 IF A=1 THEN130 
 70 PRINT"{CLR,YELLOW,DOWN,RVSON,2SPACE}BILDUMSCHREIBEROUTINE{17SPACE,RVOFF}" 
 80 PRINT"{2SPACE}QUELLDISKETTE EINLEGEN , DANN BILD-{4SPACE,DOWN,SPACE}KENNZIFFER EINGEBEN !" 
 90 INPUT"{2DOWN}";K$ 
 100 IF K$<"A"OR K$>"Z" THEN 50 
 110 POKE 55,0:POKE 56,96 
 120 A=1:LOAD "?PIC "+K$+"*",8,1 
 130 : 
 140 : 
 150 PRINT"{DOWN,RVSON,2SPACE}BILDUMSCHREIBEROUTINE{17SPACE,RVOFF}" 
 160 PRINT" ZIELDISK EINLEGEN , DANN GEWUENSCHTEN{3SPACE,DOWN}NAMEN EINGEBEN !" 
 170 INPUT"{DOWN,SPACE}";N$ 
 180 OPEN 1,8,1,N$+",P,W" 
 190 PRINT#1,CHR$ (142);CHR$ (63); 
 200 FOR I=16270 TO16383:PRINT#1,CHR$ (0);:NEXT 
 210 FOR I=24576 TO32767:PRINT#1,CHR$ (PEEK (I));:NEXT 
 220 FOR I=32576 TO33599:PRINT#1,CHR$ (PEEK (I));:NEXT 
 230 CLOSE 1 
Listing 1. Der Bildumwandler

In manchen Fällen ist es nötig, daß die Farbeinstellungen nachträglich per Hand korrigiert werden müssen.

Paint Magic Diashow

Im folgenden wird erklärt, wie Sie Paint-Magic-Bilder innerhalb von Basic-Programmen laden und darstellen können. Die Paint-Magic-Bilder können übrigens auch direkt geladen werden und mittels RUN betrachtet werden, da vor jedem Bild ein kleines Programm zur Bilddarstellung mit gespeichert wird.

Und so werden die Bilder innerhalb von Programmen geladen und dargestellt:

Zunächst müssen sie in einer neuen Form gespeichert werden. Dazu:

  1. Bild laden.
  2. Bild mit »RUN« einschalten.
  3. Bild mittels RUN-STOP/RESTORE ausschalten.
  4. POKE 24565,96 im Direktmodus eingeben.
  5. Den Bereich von hex 4000 - 6400 (=Bild) mit einem Monitor speichern.

Das so gespeicherte Paint-Magic-Bild kann jetzt innerhalb eines Programmes absolut geladen werden (,8,1) und mittels SYS 24513 dargestellt werden.

Um das Bild wieder auszuschalten, sind folgende POKEs notwendig:

POKE 53272,21 : POKE 56576,151 : POKE 53265,27
POKE 53270,200

So lassen sich ganz einfach Dia-Shows herstellen.

Fenstertechnik auf dem C 64

Im folgenden zeige ich Ihnen, wie Sie HiRes-Bilder in Ihre eigenen Adventures einbauen können. Die Idee besteht darin, den Bildschirm des C 64 in eine Grafik und in ein Textfenster zu unterteilen.

Bild 1 zeigt, wie der Bildschirm unterteilt wird. In der oberen Hälfte wird ein Multicolor-HiRes-Fenster mit der Auflösung 96 mal 160 Bildpunkte dargestellt.

Bildschirm geteilt in Grafik-Fenster (12 x 40 Zeichen), Leerzeile und Textfenster (12 x 40 Zeichen)
Bild 1. Aufteilung des Bildschirms

Die 13. Textzeile bleibt als Trennung leer. Die unteren 12 Zeilen sind Text-Bildschirm.

Die Routine ist speziell für Adventures gedacht, die auf relativer Dateien-Basis und mit einem deutschen Zeichensatz arbeiten. Das MSE-Listing zur Fensterroutine finden Sie in Listing 2.

PROGRAMM : FENSTER        9C00 9D4B
-----------------------------------
9C00 : 00 4C 0A 9C 4C EA 9C 4C   64
9C08 : 16 9D 78 A9 00 8D 00 9C   E6
9C10 : AE C3 9C 20 C4 9C A9 01   A5
9C18 : 8D 12 D0 AD 11 D0 29 7F   D3
9C20 : 8D 11 D0 A9 3F 8D 14 03   56
9C28 : A9 9C 8D 15 03 A9 7F 8D   BC
9C30 : 0D DC A9 01 8D 1A D0 AD   7E
9C38 : 19 D0 8D 19 D0 58 60 AD   EC
9C40 : 00 9C F0 25 CE 00 9C A9   22
9C48 : 01 8D 12 D0 EA EA EA EA   36
9C50 : EA EA EA EA EA EA EA EA   4F
9C58 : EA EA EA EA EA 20 A8 9C   5B
9C60 : AD 19 D0 8D 19 D0 4C 31   2B
9C68 : EA EE 00 9C A9 91 8D 12   DE
9C70 : D0 20 7D 9C AD 19 D0 8D   45
9C78 : 19 D0 4C 81 EA A9 01 8D   58
9C80 : 00 DD A9 3B 8D 11 D0 A9   39
9C88 : D8 8D 16 D0 A9 80 8D 18   CB
9C90 : D0 AD C2 9C 8D 21 D0 A0   E1
9C98 : 28 A9 00 99 DF D9 AD C3   D3
9CA0 : 9C 99 B7 D9 88 D0 F2 60   CD
9CA8 : A9 00 8D 00 DD A9 1B 8D   67
9CB0 : 11 D0 A9 C8 8D 16 D0 A9   CD
9CB8 : 3A 8D 18 D0 A9 00 8D 21   EC
9CC0 : D0 60 0C 00 A9 00 85 FB   6C
9CC8 : A8 A9 D8 85 FC 8A 91 FB   8E
9CD0 : 18 A5 FB 69 01 85 FB A5   5E
9CD8 : FC 69 00 85 FC A5 FB C9   BA
9CE0 : 08 D0 EA A5 FC C9 DA D0   EB
9CE8 : E4 60 78 20 A8 9C A2 07   26
9CF0 : 20 C4 9C A9 01 8D 12 D0   35
9CF8 : A9 0A 8D 14 03 A9 9D 8D   9B
9D00 : 15 03 58 AD 19 D0 8D 19   E3
9D08 : D0 60 AD 19 D0 8D 19 D0   16
9D10 : 4C 31 EA 41 20 42 8D 13   48
9D18 : 9D A9 42 8D 15 9D 20 36   F7
9D20 : 9D A9 56 8D 15 9D 20 36   04
9D28 : 9D AD FF 9F 8D C2 9C AD   4C
9D30 : FE 9F 8D C3 9C 60 A2 08   41
9D38 : A0 01 20 BA FF A9 03 A2   57
9D40 : 13 A0 9D 20 BD FF A9 00   91
9D48 : 4C D5 FF                  FC
Listing 2. Die Fenster-Routine

Wie bereits gesagt, arbeitet die Routine auch dann, wenn der deutsche Zeichensatz verwendet wird. Das Ladeprogramm, mit dem zu Beginn eines Adventures die Fenster-Routine geladen und der deutsche Zeichensatz geladen und aktiviert wird, finden Sie in Listing 3.

|
10 ifa=1then50
20 ifa=2then60
30 poke55,0:poke56,128
40 clr:a=1:load"d.z.satz",8,1
50 a=2:load"fenster",8,1
60 poke648,204:poke53272,56:poke56576,0
70 print"{clr}"
 10 IF A=1 THEN50 
 20 IF A=2 THEN60 
 30 POKE 55,0:POKE 56,128 
 40 CLR :A=1:LOAD "D.Z.SATZ",8,1 
 50 A=2:LOAD "FENSTER",8,1 
 60 POKE 648,204:POKE 53272,56:POKE 56576,0 
 70 PRINT"{CLR}" 
Listing 3. Lader für die Fenster-Routine

In Zeile 30 wird der Zeiger auf die Speicher-Obergrenze verschoben. Dies ist notwendig, um die Routine, die teils den Basic-RAM beansprucht, vor Überschreiben durch Basic-Programme zu schützen.

Bild 2 zeigt, wie es jetzt im Speicher des C 64 aussieht. Die Fenster-Routine nimmt schon ziemlich viel RAM in Anspruch:

Speicherleiste von 0 bis 65535 mit RAM-Bereichen, belegten Bereichen und der Fenster-Routine bei 39136
Bild 2. Die aktuelle Speicherbelegung
32768-39135 Unterbringung der Bit-Map
39136-40959 Hier steht die eigentliche Fenster-Routine
40960-41983 Farbinformationen für das HiRes-Bild

Jetzt stehen nur noch 30717 KByte Basic-RAM zur Verfügung. Die schräg gestrichelten Bereiche sind die noch freien RAM-Bereiche. Wer Adventures mit Grafik-Fenster programmieren will, muß also ziemlich hart kalkulieren. Aufgrund der Adventure-Programmiertechniken, die Sie bisher in diesem Kurs kennengelernt haben, können Sie den Verlust des Fenster-RAMs durch geschickte Programmierung wieder ausgleichen.

Hier noch ein Tip für alle ausgefuchsten Programmierer, die kein Byte ungenutzt sein lassen wollen: Der RAM-Bereich, der für Bit-Map und Farbinfo benutzt wird, wird eigentlich gar nicht ganz beansprucht, da unsere Fensterbilder nur eine Auflösung von 96 mal 160 haben. Das heißt, in den RAM-Bereichen von 36929-39135 und 41480-41982 können noch kleine Maschinenroutinen untergebracht werden. Und so wird mit der Fensterroutine gearbeitet:

Bei ausgeschaltetem Fenster steht der ganze Bildschirm als Textfenster zur Verfügung. Mittels SYS 39937 wird das Fenster eingeschaltet beziehungsweise eingeblendet. SYS 39940 schaltet das Fenster wieder aus. Der Text beziehungsweise Bildschirminhalt, der sich unter dem eingeblendeten Fenster befand, ist jetzt wieder sichtbar. Allerdings ist dieser Text einfarbig. Die Farbe (0-15), die der Text nach Ausschalten des HiRes-Fensters annimmt, steht in Speicherzelle 40175. Mittels POKE 40175,FARBE kann also variiert werden. Auch Text, der unter das eingeschaltete Fenster gescrollt wird, ist nach Ausschalten des Fensters wieder sichtbar. Das Fenster ist völlig Interrupt-gesteuert – deshalb flimmert die unterste Zeile manchmal ein wenig, was jedoch kaum stört.

Durch die Interrupt-Programmierung ist es jetzt auch nicht mehr so einfach, zwischen dem Groß/klein- und Groß/grafik-Zeichensatz umzuschalten. Hier muß auch wieder gePOKEt werden. Und zwar POKE 40120,58 um den Groß/klein-Zeichensatz und POKE 40120,56 um den Groß/grafik-Zeichensatz einzuschalten. Jetzt müssen Sie natürlich noch wissen, wie man Fenstergrafiken lädt. Hierzu dient ein kleines Programm, das Paint-Magic ins Fensterformat umwandelt. Sie benötigen also Paint-Magic-Bilder, wobei das spätere Fensterbild die oberen 12 Zeilen (beziehungsweise 96 vertikale Bildpunkte) des Paint-Magic-Bildes einnimmt.

Das Programm in Listing 4 funktioniert ganz einfach: Zuerst muß die Diskette, auf der sich das Paint-Magic-Bild befindet, eingelegt werden. Nach dem Laden wird das Programm auf einer Zieldiskette gespeichert. Wichtig ist dabei, daß der Filename des Fensterbildes nur ein einziges Zeichen lang sein darf. Außerdem müssen die Hintergrundfarbe (1. Farbe) des Bildes sowie die 4. Farbe angegeben werden – also mit Hilfe von Paint-Magic lesen und notieren. Auf einer Diskette finden 30 Bilder im Fensterformat Platz. Jetzt müssen Sie nur noch wissen, wie Bilder mit Hilfe der Fensterroutine geladen werden:

POKE 780, ASC("Zeichen") : SYS 39943

Für »Zeichen« muß der Filename des Bildes (der aus nur einem Zeichen bestehen darf) eingesetzt werden.

|
5 print"{clr}{rvon}bildumschreiberoutine{rvof}"
10 rem bildumschreiber paint magic
20 rem
30 rem von wolfgang borgsmueller
40 rem
45 ifa=1then500
50 poke55,144:poke56,48
60 clr:a=1
65 print"bitte quelldisk einlegen und name des   paint-magic bildes eingeben!"
66 input"name ";f$
70 loadf$,8,1
80 end
500 print"zieldisk einlegen!":poke198,0
510 geta$:ifa$=""goto510
511 print"bitte geben sie den kennbuchstaben des  fensterbildes ein!
512 inputc$
520 open1,8,1,left$(c$,1)+" b,p,w"
525 print#1,chr$(0);chr$(128);
530 fori=16384to21184
540 print#1,chr$(peek(i));:next
550 close1
555 input"hg-farbe des bildes";hg
556 input"farbe 4 des bildes";f4
560 open1,8,1,left$(c$,1)+" v,p,w"
565 print"bildname: ";c$
570 print#1,chr$(254);chr$(159);chr$(f4);chr$(hg);
580 fori=24576to25176
590 print#1,chr$(peek(i));:next
600 close1
  5 PRINT"{CLR,RVSON}BILDUMSCHREIBEROUTINE{RVOFF}" 
 10 REM BILDUMSCHREIBER PAINT MAGIC 
 20 REM 
 30 REM VON WOLFGANG BORGSMUELLER 
 40 REM 
 45 IF A=1 THEN500 
 50 POKE 55,144:POKE 56,48 
 60 CLR :A=1 
 65 PRINT"BITTE QUELLDISK EINLEGEN UND NAME DES{3SPACE}PAINT-MAGIC BILDES EINGEBEN!" 
 66 INPUT"NAME ";F$ 
 70 LOAD F$,8,1 
 80 END 
 500 PRINT"ZIELDISK EINLEGEN!":POKE 198,0 
 510 GET A$:IF A$=""GOTO 510 
 511 PRINT"BITTE GEBEN SIE DEN KENNBUCHSTABEN DES{2SPACE}FENSTERBILDES EIN! 
 512 INPUTC$ 
 520 OPEN 1,8,1,LEFT$ (C$,1)+" B,P,W" 
 525 PRINT#1,CHR$ (0);CHR$ (128); 
 530 FOR I=16384 TO21184 
 540 PRINT#1,CHR$ (PEEK (I));:NEXT 
 550 CLOSE 1 
 555 INPUT"HG-FARBE DES BILDES";HG 
 556 INPUT"FARBE 4 DES BILDES";F4 
 560 OPEN 1,8,1,LEFT$ (C$,1)+" V,P,W" 
 565 PRINT"BILDNAME: ";C$ 
 570 PRINT#1,CHR$ (254);CHR$ (159);CHR$ (F4);CHR$ (HG); 
 580 FOR I=24576 TO25176 
 590 PRINT#1,CHR$ (PEEK (I));:NEXT 
 600 CLOSE 1 
Listing 4. Wandler Paint Magic → Fensterformat

Probleme mit der Fensterroutine

Bei eingeschaltetem Fenster kommt es zu Schwierigkeiten bei Disk-Operationen (zum Beispiel Laden von relativen Files): der Bildschirm beginnt dann wild zu flackern. Dies liegt daran, daß Diskettenoperationen störend auf programmierte Video-Interrupts wirken. Vielleicht kann man dies sogar als einen Fehler im C 64-Betriebssystem bezeichnen. Es ist möglich, Fensterroutinen beziehungsweise Interrupts zu programmieren, bei denen Diskettenoperationen nicht stören. Dazu muß jedoch das Betriebssystem vom ROM ins RAM kopiert und dort verändert werden. Für diese Lösung habe ich mich jedoch nicht entschieden, weil dann zuviel RAM-Speicher verlorengegangen wäre. Man muß vor Diskettenoperationen das Fenster aus- und erst später wieder einschalten.

Zusammenfassung

Fenster einschalten: SYS 39937
Fenster ausschalten: SYS 39940
Bild laden: POKE 780,ASC("Zeichen"):SYS 39943
Zeichenfarbe hinter Fenster: POKE 40175,FARBE
Groß/klein-Zeichensatz einschalten: POKE 40120,58
Groß/grafik-Zeichensatz einschalten: POKE 40120,56

Viel Spaß beim Fensterln!

PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →