Kapitel 5: Fortgeschrittene Farb- und Grafikprogrammierung

Farbe und Grafik

Wir haben nun schon einige der hochentwickelten Programmiermöglichkeiten des COMMODORE 64 kennengelernt. Eine der faszinierendsten Eigenschaften dieses Computers besteht jedoch in der Möglichkeit, Farbgrafiken zu erstellen.

Einfache Beispiele waren das “Springball”-Programm und der Irrgarten. Aber die Möglichkeiten Ihres Computers sind unvergleichlich größer. In diesem Abschnitt werden wir Ihnen zeigen, wie Sie Farbgrafiken erstellen und in eigenen Spielen einsetzen können. Da wir uns bis jetzt auf die Rechenmöglichkeiten unseres Computers konzentriert haben, haben wir uns auf die Standardfarben des Bildschirms (hellblaue Schrift auf dunkelblauem Hintergrund mit hellblauem Rand) beschränkt.

Nun wollen wir Ihnen zeigen, wie Sie diese Farben ändern können und wie Sie die vielen Grafiksymbole Ihres COMMODORE 64 einsetzen können.

Farbgebung mit PRINT-Befehlen

Wenn Sie den Farbjustagetest in Kapitel 1 gemacht haben, so können Sie sich sicher daran erinnern, daß man die Zeichenfarbe einfach dadurch ändern kann, daß man die <CTRL>-Taste und eine der Zifferntasten drückt. Aber wie kann man die Farben im Rahmen eines Programms ändern?

Wie wir im “Springball”-Programm gesehen haben, kann man Befehle, die von der Tastatur eingegeben werden können, durch Verwendung zusammen mit PRINT-Befehlen auch im Programm einsetzen. Sie haben eine Skala von 16 Zeichenfarben zur Verfügung. Durch Benutzung der <CTRL>-Taste und der Zifferntasten können Sie folgende erzeugen:

12345678
schwarzweißrottürkisviolettgrünblaugelb

Durch Verwendung der <C=>-Taste zusammen mit den Zifferntasten erhalten Sie zusätzlich folgende Farben:

12345678
orangebraunhellrotgrau 1grau 2hellgrünhellblaugrau 3

Tippen Sie nun NEW ein und machen folgendes Experiment:
Nach dem Zeilenanfang 10 PRINT” drücken Sie zusammen die <CTRL>-und die <1>-Taste. Lassen Sie dann die Tasten los und drücken die <S>-Taste. Nun drücken Sie die <CTRL>-Taste zusammen mit der <2>-Taste und dann die <P>-Taste allein.

Wählen Sie auf diese Weise eine Farbe nach der anderen an und geben dazwischen die Buchstaben des Wortes SPEKTRUM ein.

Plain Text

Wie bei der Cursorsteuerung werden auch die Farbsteuerzeichen als graphische Zeichen dargestellt.

Bei gleichzeitigem Drücken von <CTRL> und <3> (natürlich nur nachdem Sie vorher auf <“> gedrückt haben) erscheint das Pfundzeichen (£) und <CTRL> <7> ergibt den Pfeil nach links (←). Die nachfolgende Tabelle gibt eine Zusammenstellung dieser Farbcodes.

Wie Sie schon bemerkt haben, werden die Steuerzeichen nur beim Listen des Programms sichtbar, bei der Programmausführung, d. h., beim Drucken des Wortes SPEKTRUM tauchen Sie nicht mehr auf, nur der TEXT wird (mit den entsprechenden Farbvariationen) ausgegeben. Spielen Sie nun einige Möglichkeiten durch, um mit der Farbsteuerung vertraut zu werden, und vergessen Sie nicht, daß Sie noch weitere Farbmöglichkeiten im Zusammenhang mit der <C=>-Taste haben.

Information

Nach Beendigung eines Programms, in dem Sie die Farbsteuerung angewandt haben,
bleibt der Computer in dem Modus, den Sie als letztes eingeschaltet hatten. Sie
kommen in den Normalmodus (hellblau, dunkelblau) zurück, wenn Sie <RUN/STOP>
<RESTORE>
drücken.

Farb-CHR$-Codes

Wie Sie dem Anhang F (Liste der CHR$-Codes) entnehmen können, haben die Farben (aber auch z. B. die Cursor-Steuerbefehle) Zahlencodes. Diese Codes können zusammen mit dem PRINT-Befehl direkt benutzt werden, sie haben dieselbe Wirkung wie das Drücken der <CTRL> und der entsprechenden Zifferntaste. Probieren Sie z. B. folgendes Beispiel aus:

Die Schrift sollte nun grün sein. In vielen Fällen ist die Verwendung der CHR$-Funktion zur Farbsteuerung wesentlich einfacher, als die Verwendung der Farbtasten. Das nachfolgende Programm erzeugt farbige Balken auf dem Bildschirm. Beachten Sie, daß sich die Zeilen 40-190 nur in den Zeilennummern und den Argumenten der CHR$-Funktion unterscheiden. Sie brauchen also nur einmal den vollen BASIC-Text einzutippen und können dann durch Ändern der Zeilennummer und der CHR$-Funktion die anderen Zeilen erzeugen (Siehe weiter unten: Edierhinweise).

Plain Text

Nach dem Eintippen der Zeilen 1 bis 40 sollte Ihr Bildschirm wie folgt aussehen:

EDIERHINWEISE

Bewegen Sie zuerst den Cursor mit Hilfe der Cursor-Steuertasten auf die “4” der Zeilennummer 40. Tippen Sie nun eine “5”, so daß die Zeilennummer 50 entsteht. Steuern Sie nun den Cursor zwischen die Klammern der CHR$-Funktion. Durch Drücken von <SHIFT> <INST/DEL> schaffen Sie dort Platz für eine zweistellige Zahl und tippen dann die “28” ein. Nach dem Drücken der <RETURN>-Taste sollte der Bildschirm wie folgt aussehen.

Wenn Sie sich das Programm neu auflisten lassen, werden Sie feststellen, daß die Zeile 40 weiterhin existiert. Wenn Sie jetzt in der neuen Zeile 50 in gleicher Weise Zeilennummer und CHR$-Code verändern, können Sie eine weitere Zeile erzeugen, und auf diese Weise das Programm mit geringem Aufwand fertigstellen. Vergleichen Sie zum Schluß noch einmal den gesamten Programmtext und starten Sie es dann.

Hier eine kurze Beschreibung, wie das Programm funktioniert:

Wahrscheinlich ist Ihnen die Wirkung der meisten Befehle klar, bis auf den Befehl in Zeile 30.

Aber lassen Sie uns trotzdem noch einmal kurz den Programmverlauf verfolgen.

In Zeile 10 wird der CHR$-Code für <CLR/HOME> ausgedruckt, was das Löschen des Bildschirms bewirkt.

In Zeile 10 wird der REVERS-Modus eingeschaltet und 6 Leerstellen werden ausgedruckt, die als Balken in der Zeichenfarbe erscheinen. Beim ersten Durchlauf wird als Farbe die Standardfarbe hellblau auftauchen.

Zeile 20 ist unser “Arbeitspferd”, hier werden die Zufallszahlen für die Farbwahl erzeugt.

Zeile 30 enthält eine Variation der IF … THEN Anweisung. Die ON … GOTO Anweisung läßt das Programm verzweigen, wobei die Wahl einer der hinter GOTO aufgeführten Sprungadressen von der Zahl CL abhängt, die zwischen ON und GOTO steht. Hat CL den Wert 1, so wird die erste Sprungadresse gewählt (in unserem Beispiel Zeile 40), hat CL den Wert 4, so wird die vierte Sprungadresse gewählt etc.

Die Zeilen 40-190 wandeln nun die Zufallszahlen zwischen 1 und 8 in CHR$-Codes für die Farbwahl um und lassen dann das Programm in die Zeile 10 zurückspringen, wo das Spiel von neuem beginnt.

PEEK und POKE

Nun werden wir eine Methode kennenlernen, wie wir uns im Computer “umschauen” können und Informationen an von uns ausgewählte Stellen bringen, um den Computer zu steuern.

In derselben Weise, wie man sich die Variablen als “Schachteln” vorstellen kann, in die Information “eingefüllt” werden kann, so kann man sich auch vorstellen, daß die Speicherplätze des COMMODORE 64 solchen “Schachteln” entsprechen. Der Inhalt einiger Speicherplätze hat nun ganz bestimmte Bedeutungen. So gibt es Speicher, wo der Computer “nachschaut”, welche Bildschirm- oder Rahmenfarbe eingeschaltet ist, welches Zeichen auf dem Bildschirm angezeigt werden soll, welche Farbe es haben soll, wo es stehen soll usw.

Wenn man den Inhalt dieser Speicherplätze ändert, so kann man also auch die oben angeführten Parameter bestimmen. Man kann Farben ändern, Objekte auf dem Bildschirm erscheinen und sich bewegen lassen und sogar Töne erzeugen und zu Musikstücken zusammensetzen.

Schreibt man Werte direkt in den Computerspeicher, so geschieht das mit Hilfe des POKE-Befehls. Man sagt deshalb auch, man “poked” einen Wert in eine Speicherstelle. Man kann Speicherstellen etwa auf folgende Art darstellen

Hier haben wir 4 Speicherplätze dargestellt, von denen zwei die Bildschirm- und Hintergrundfarbe bestimmen.

Tippen Sie bitte folgendes ein:

Plain Text

Nach dem Drücken der <RETURN>-Taste erhalten wir einen gelben Bildschirm, da wir den Wert “7” – diese Zahl steht für die Farbe “gelb” -, in die Speicherstelle “gepoked” haben, die die Bildschirmfarbe bestimmt. Versuchen Sie dasselbe mit anderen Zahlenwerten. Sie können jede Zahl zwischen 0 und 255 verwenden; sinnvoll sind jedoch nur die Zahlen von 0 bis 15.

Der nachstehenden Tabelle können Sie entnehmen, wie die verschiedenen Zahlenwerte den Farben zugeordnet sind.

0schwarz8orange
1weiß9braun
2rot10hellrot
3türkis11grau 1
4violet12grau 2
5grün13hellgrün
6blau14hellblau
7gelb15grau 3

Nun wollen wir uns verschiedene Kombinationen von Hintergrund- und Rahmenfarben anschauen. Dabei hilft uns folgendes Programm:

Zwei Schleifen werden ineinander geschachtelt, um alle Kombinationen zu erfassen. Die zusätzliche Schleife in Zeile 50 verzögert den ganzen Vorgang nur ein bißchen.

Wenn das Programm abgelaufen ist, tippen Sie ein:

Plain Text

Als Antwort sollte eine “15” auf dem Bildschirm stehen. Dies ist sinnvoll, da als letzter Wert eine “15” in das RAHMEN-Farbregister geschrieben wurde.

Durch die logische Verknüpfung “AND” blenden Sie die Zahlen, die größer als 15 sind, aus. Was das genau bedeutet, läßt sich nur im Rahmen der Arithmetik der binären Zahlen beschreiben. Darauf wird im Kapitel über die “SPRITES” näher eingegangen.

Wenn wir nun die Werte, die in den entsprechenden Registern stehen, während des “Farbwechselprogramms” auf dem Bildschirm ausdrucken lassen wollen, müssen wir die folgende Programmzeile hinzufügen:

Plain Text

Bildschirmgrafik

Bis jetzt haben wir die Zeichen “sequentiell” auf dem Bildschirm gedruckt, d. h. eins nach dem anderen, es sei denn wir hätten eine neue Zeile eingeschaltet, oder mit “,” den Ausdruck formatiert.

Den Cursor haben wir bisher durch PRINT-Befehle gesteuert. Damit läßt sich jeder Punkt des Bildschirms erreichen; die Methode ist jedoch im allgemeinen langsam und verbraucht wertvollen Programmspeicherplatz.

Aber wie es Speicherplätze im COMMODORE 64 gibt, die die Bildschirmfarben bestimmen, so gibt es auch Speicherplätze, die den verschiedenen Bildschirmpositionen zugeordnet sind.

Der Bildschirmspeicher

Da der Bildschirm unseres Computers aus 25 Zeilen á 40 Zeichen besteht, können wir 1000 Zeichen auf ihm unterbringen und brauchen natürlich genauso viele Speicherplätze, die Informationen darüber enthalten, welche Zeichen sich in den einzelnen Bildschirmpositionen befinden. Wir können uns den Bildschirm als rechtwinkliges Gitter vorstellen (siehe unten), und jeder “Masche” in diesem Gitter entspricht eine SpeicherzelIe.

Sie können in diese Speicherzellen Werte zwischen 0 und 255 hineinschreiben (“poken”); welche Zeichen Sie dann an der entsprechenden Stelle auf dem Bildschirm ausgedruckt erhalten, können Sie der Tabelle im Anhang E entnehmen.

Der Bildschirmspeicher des COMMODORE 64 beginnt bei 1024 und geht bis zur Speicherstelle 2023. Die Speicherstelle 1024 entspricht dabei der linken oberen Ecke des Bildschirms und die Adressen nehmen jeweils von links nach rechts zu. Zur weiteren Orientierung betrachten Sie bitte das Schema.

Nehmen wir nun an, Sie wollen einen Ball auf dem Bildschirm hin- und herspringen lassen. Der Ball soll sich zu Beginn etwa in der Mitte des Bildschirms befinden: Spalte 20, Zeile 12. Die zugehörige Speicheradresse wird dann wie folgt berechnet:

Plain Text

Die Bildschirmadresse unseres Balls hat also den Wert

Plain Text

Löschen Sie nun den Bildschirm mit <SHIFT> <CLR/HOME> und tippen Sie ein:

Der Farbspeicher

Sie haben nun einen Ball in der Mitte des Bildschirms erzeugt. Sie haben dies erreicht, ohne einen PRINT-Befehl zu benutzen; Sie haben direkt einen Wert in den Bildschirmspeicher geschrieben. Der Ball der erschien war hellblau. Es gibt jedoch einen Speicher in Ihrem COMMODORE 64, wo Sie durch Ändern der Speicherinhalte die Farben von einzelnen Zeichen auf dem Bildschirm bestimmen können. Tippen Sie nun folgendes ein:

Der Ball wird daraufhin rot.

Da Sie außer der Information über das Zeichen in einer bestimmten Bildschirmposition auch eine Farbinformation brauchen, entsprechen jeder Position auf dem Bildschirm zwei Speicherstellen; eine im Bildschirmspeicher und eine im Farbspeicher. Der Farbspeicher beginnt bei 55296 (linke obere Ecke) und hat natürlich, wie der Bildschirmspeicher, 1000 Speicherstellen.

Die Farbcodes liegen zwischen 0 und 15 und entsprechen denen, die wir benutzt haben, um die Farbe von Hintergrund und Rahmen zu ändern (siehe S. 61). Die Formel zur Berechnung der Farbspeicheradresse ist bis auf den Startwert dieselbe wie bei der Bildschirmadresse:

Plain Text

Ein weiteres Springballpiel

Auf dieser Seite ist das Programm eines Ballspiels abgedruckt, das eine entscheidende Verbesserung gegenüber dem früheren Beispiel bedeutet. Es arbeitet nicht mehr mit PRINT-, sondern mit POKE-Befehlen. POKE Anweisungen lassen sich wesentlich flexibler handhaben und erlauben die Darstellung komplizierter Bewegungsvorgänge auf dem Bildschirm.

Plain Text

In Zeile 10 wird der Bildschirm gelöscht; in Zeile 20 wird als Hintergrundfarbe schwarz und als Rahmenfarbe gelb gewählt.

Die Variablen X und Y in Zeile 30 stehen für die Zeile und die Spalte, in der sich der Ball momentan befindet. Die Variablen DX und DY in Zeile 40 geben die horizontale und vertikale Bewegungsrichtung des Balls an. DX = + 1 entspricht einer Bewegung nach rechts, DX = – 1 einer Bewegung nach links, analog entsprechen DY = + 1 bzw. DY = – 1 Bewegungen nach unten bzw. oben. In den Zeilen 50 und 55 wird der Ball in der durch Zeilen- und Spaltennummer bestimmten Position ausgedruckt und in Zeile 60 taucht wieder die bekannte Verzögerungsschleife auf; schließlich wollen wir den Ball auf dem Bildschirm ja auch sehen.

In Zeile 70 wird der Ball durch Überschreiben mit einem Leerzeichen (“Space”) gelöscht.

In Zeile 80 wird durch Addition von DX der Ball in der richtigen Richtung bewegt; das Vorzeichen von DX wird umgedreht, wenn in Zeile 90 festgestellt wird, daß der Ball den linken oder rechten Rand berührt. In den Zeilen 100 und 110 geschieht dasselbe für den oberen und unteren Rand. Die Zeile 120 bewirkt einen Sprung in die Zeile 50, wo der Ball in der neu berechneten Position auf dem Bildschirm ausgegeben wird.

Wenn Sie in Zeile 55 die 81 gegen eine andere Zahl austauschen, so können Sie den Ball durch ein beliebiges Zeichen ersetzen.

Durch folgende Ergänzung können wir das Programm noch ein bißchen intelligenter machen:

Plain Text

Die Zeilen 21 bis 27 besetzen zufällig gewählte Bildschirmpositionen mit Hindernissen. In den Zeilen 85 und 105 wird mit Hilfe der PEEK-Funktion geprüft, ob der Ball gegen ein Hindernis stößt; ist dies der Fall, so wird die Bewegungsrichtung geändert.