GSHAPE (BASIC 3.5)

Aus C64-Wiki
Zur Navigation springenZur Suche springen
GSHAPE (BASIC 3.5)
Syntax: GSHAPE Zeichenkette[,<Koordinaten>][, [<Modus>]
Parameter
<Zeichenkette>: Zeichenkettenausdruck
<Koordinaten>: [+¦-]<X1>,[+¦-]<Y1> ¦ <Strecke>;<Winkel>
<Modus>: numerischer Ausdruck im Wertebereich von 0 bis 4
Einordnung
Typ: Anweisung
Kontext: Grafik-Anweisung
Aufgabe: In einer Zeichenkette gespeichertes Bild auf den Grafikbildschirm ausgeben
Abkürzung: gS
Token: $e3 (227)
Verwandte Befehle
SSHAPE

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl GSHAPE ab Commodore BASIC V3.5 oder höher.

Die Anweisung GSHAPE (für engl. Get SHAPE, auf deutsch: hole Form/Gebilde) überträgt ein vorher (z.B. mittels SSHAPE) in einer Zeichenkette gespeichertes Bild auf den Grafikbildschirm.

Die Anweisung kennt folgende Parameter:

  1. Zeichenkette: Ein beliebiger Ausdruck, der eine Zeichenkette mit den binär kodierten Grafikdaten zurückliefert.
  2. Koordinaten X1,Y1: Position, an der das Shape eingefügt wird. Dieser Parameter ist optional, beim Fehlen wird die Position des Pixelcursors verwendet. Wie auch bei anderen Grafikbefehlen unter BASIC V3.5, können die Koordinaten absolut-kartesisch, relativ-kartesisch zum Pixelcursor oder als Vektor mit den Angaben Länge und Winkel relativ zum Pixelcursor angegeben werden. Kartesische Koordinaten werden in der Form X,Y angegeben, Vektor-Parameter dagegen in der Form Streckenlänge;Winkel. Die Winkelangabe erfolgt in Grad im Uhrzeigersinn, wobei 0 Grad senkrecht nach oben gerichtet bedeutet. Für relative Positionsangaben mit Variablen müssen diese in runden Klammern geschrieben werden. Der erlaubte Wertebereich für die Koordinaten reicht von -65535 bis +65535, wobei negative absolute Koordinaten über Variablen übergeben werden müssen (wie sinnvoll das auch immer sein mag). Werte außerhalb des erlaubten Bereiches führen zu einem ?ILLEGAL QUANTITY ERROR.
  3. <Modus>: Dieser Wert bestimmt, wie das Bild in den Grafikbildschirm eingefügt wird. Wird der Parameter weggelassen, wird der Standardwert 0 benutzt. Dieser Parameter kann nur angegeben werden, wenn auch die Koordinaten angegeben wurden, ansonsten wird ein ?SYNTAX ERROR ausgegeben.

Erlaubte Werte für <Modus>:

  • 0: Das Shape wird ohne Veränderung in die Bitmap kopiert.
  • 1: Das Shape wird invertiert in die Bitmap kopiert.
  • 2: Die Pixelinformationen der Bitmap werden mit jener des Shapes überlagert (logisches Oder), d.h. Pixel werden gesetzt, wenn sie im Shape gesetzt sind, ansonsten bleibt die Bitmap unverändert.
  • 3: Die Pixelinformationen der Bitmap werden mit jener des Shapes logisch Und-verknüpft, d.h. es werden nur dort Pixel gezeichnet, wo sowohl im Bitmap als auch im Shape die Pixel gesetzt sind. Anderenfalls werden die Pixel gelöscht. Dieser Modus kann dazu benutzt werden, einen unregelmäßigen Bildschirmbereich zu löschen.
  • 4: Die Pixelinformationen der Bitmap werden mit jener des Shapes logisch Exklusiv-Oder-verknüpft, d.h. ein Pixel wird gesetzt, wenn es in Bitmap und Shape unterschiedlich gesetzt ist, andernfalls gelöscht. Durch zweimaliges Ausführen von GSHAPE in diesem Modus an der selben Position, wird die Änderung wieder rückgängig gemacht.

Andere Werte verursachen einen ?ILLEGAL QUANTITY ERROR.

Anmerkungen:

  • Bei Mehrfarbengrafik sollten in den Modi 2 und 3 nur Pixel in der Hintergrundfarbe oder in der Multicolorfarbe 2 enthalten bzw. der Zielbereich des Grafikbildschirms leer sein. Ansonsten entstehen durch die bitweise Verknüpfung der Pixelinformation Farbmuster.
  • Aus dem selben Grund sind auch die Modi 1 und 4 bei Multicolor-Grafik wenig nützlich.
  • Nach Ausführung von GSHAPE befindet sich der Pixelcursor an der Position X1, Y1 + Höhe des Shapes.
  • GSHAPE ändert nicht nur die Bitmap selbst, sondern auch den Farbspeicher: Wird ein Pixel in einer bestimmten Farbquelle gesetzt, so wird die dieser Farbquelle aktuell zugewiesene Farbe (siehe COLOR) in der Farbkachel des Pixels aktiviert (siehe Beispiel).

Beispiele[Bearbeiten | Quelltext bearbeiten]

10 COLOR 0,1:COLOR 1,2
20 GRAPHIC 1,1
30 BOX 1,4,4,19,19,,1
40 SSHAPE H$,0,0,0,0
50 SSHAPE V$,4,4,4,4
60 COLOR 0,3:COLOR 1,7
70 GSHAPE V$,4,4
80 GETKEY K$
90 GSHAPE H$,0,0

In diesem Beispiel wird zuerst ein weißes Quadrat auf schwarzem Hintergrund gemalt. Anschließend wird jeweils ein Hintergrund- und ein Vordergrundpixel in den Variablen H(intergrund)$ und V(ordergrund)$ gesichert. Dann werden der Hintergrundfarbe der Wert 3 (rot) und der Vordergrundfarbe der Wert 7 (blau) zugewiesen. Durch Zeichnen der Variable V$ wird diese Farbe aktiviert (obwohl sich das Bitmap selbst nicht ändert). Nach Drücken einer Taste wird zum Schluss auch die Hintergrundfarbe der Farbzelle auf rot geändert.

10 REM SHAPE IN VARIABLE EINLESEN
20 DO:READ D$
30 FOR I=1 TO LEN(D$)-1 STEP 2
40 SH$=SH$+CHR$(DEC(MID$(D$,I,2)))
50 NEXT
60 LOOP UNTIL RIGHT$(D$,1)="X"
70 GRAPHIC 1,1
80 REM MASKIERUNGS-SHAPE ERZEUGEN
90 BOX 1,8,8,35,32,,1
100 GSHAPE SH$,10,10
110 PAINT 1,10,10
120 SSHAPE MS$,10,10,33,33:GSHAPE MS$,10,10,1
130 GSHAPE SH$,10,10,2
140 SSHAPE MS$,10,10,33,33:GSHAPE MS$,10,10,1
150 SSHAPE MS$,10,10,33,33:REM MASKE SICHERN
160 REM HINTERGRUND ERSTELLEN
170 SCNCLR 1
180 FOR I=10 TO 180 STEP 32
190 FOR J=0 TO 20 STEP 5:DRAW 1,0,I+J TO 319,I+J:NEXT
200 NEXT
210 REM MASKE AUSGEBEN
220 FOR I=0 TO 4
230 FOR J=0 TO 5:GSHAPE MS$,10+J*50,41+32*I,I:NEXT
240 NEXT
250 REM SHAPE UEBER MASKE LEGEN
260 FOR I=0 TO 4
270 FOR J=0 TO 5:GSHAPE SH$,60+I*50,09+32*J,I:NEXT
280 NEXT
290 REM SHAPE ZERSTOERUNGSFREI UEBER BILDSCHIRM BEWEGEN
300 DO
310 X=INT(RND(1)*320):Y=INT(RND(1)*200)
320 GSHAPE SH$,X,Y,4
330 GETKEY K$
340 GSHAPE SH$,X,Y,4
350 LOOP UNTIL K$=CHR$(27)
360 DATA "02A0000000000700"
370 DATA "0005180005660005"
380 DATA "8180063860182818"
390 DATA "6038062000042000"
400 DATA "042000042F87C428"
410 DATA "85442887C4288544"
420 DATA "2C87C42880042880"
430 DATA "042880043FFFFC17"
440 DATA "001400X"

In diesem Beispiel wird die Pixelinformation eines Hauses aus den DATA-Zeilen in eine Variable eingelesen. Diese Grafik wird dann auf dem Grafikbildschirm ausgegeben und eine Ausgabemaske erzeugt. Anschließend werden zur Demonstration der verschiedenen Ausgabemodi Grafik-Shape und Masken-Shape gezeichnet. Schließlich wird das Grafik-Shape nach jeweils einem Tastendruck mit Modus 4 an zufälliger Position ausgegeben, ohne die Grafik dauerhaft zu zerstören.