004
28.11.2018, 17:51 Uhr
RobertK
|
Teil 3: Grafikausgabe
Ich darf euch kurz noch die Grafikausgabe erklären. Je nach Zielsystem wird von z88dk entweder hochauflösende Grafik oder Low-Res-Block-Grafik unterstützt. Letztere ist aus Blockgrafik-Zeichen aufgebaut (bei manchen Ziel-Systemen fehlen dafür die geeigneten Zeichen im Zeichensatz, aber bei den Robotron-Computern sind sie glücklicherweise vorhanden). Wenn ein Ziel-System mehrere Auflösungen anbietet, kann man üblicherweise in den Kompilier-Parametern angeben, welchen Grafikmodus man verwenden möchte (ohne Parameter wird eine der Auflösungen als Defaultwert verwendet), bei manchen Systemen kann man auf den gewünschten Modus auch zur Laufzeit umschalten.
In der Doku zur Library graphics.h kann man nachlesen, welche Funktionen zur Verfügung stehen. Mein Spiel verwendet davon grundsätzlich nur die Funktionen plot() zum Zeichnen und point() für die Kollisionsabfrage.
Unten habe ich ein kleines Testprogramm angefügt, mit dem ich bei neuen Zielsystemen immer erst mal die Grafikausgabe teste. Hier habe ich es etwas vereinfacht und alles nicht-Robotron-bezogene weggelassen.
Eine kurze Erklärung der vom Testprogramm verwendeten Funktionen:
plot(x,y) zeichnet ein Pixel an der Position x,y (die Koordinaten beginnen bei 0, wobei 0,0 die linke obere Ecke ist) unplot(x,y) löscht ein eventuell vorhandenes Pixel point(x,y) liefert 1, wenn sich an x,y ein Pixel befindet, ansonsten 0
Mit getmaxx() und getmaxy() kann man die verfügbare Auflösung bestimmen - was für das Cross-Developement praktisch ist, damit das Programm ohne großen Aufwand für verschiedene Plattformen kompiliert werden kann.
Weiters bietet graphics.h auch die Funktionen
c_plot(x,y) c_unplot(x,y) c_point(x,y)
Mit c_plot() wird statt einem Pixel gleich ein 4x4-Pixelblock gezeichnet, und die anderen Funktionen verhalten sich ebenfalls entsprechend. Das dient dazu, um Blockgrafik-Programme sehr einfach auf Systeme mit hoher Auflösung portieren zu können. Bei meinem Spiel habe ich z.B. beim Zielsystem KC85/2-5 davon Gebrauch gemacht.
Das Kompilieren des Testprogrammes erfolgt mittels folgender Befehle:
Quellcode: | zcc +z1013 -create-app plottestkc.c -o plottestkc_z1013 zcc +z9001 -lgfx9001 -create-app plottestkc.c -o plottestkc_z9001 zcc +kc -lndos -pragma-redirect:fputc_cons=fputc_cons_generic -create-app plottestkc.c -o plottestkc_kc85 |
Bei manchen Zielsystemen wie dem KC85/2-5 muss man eine entsprechende Konsole angeben, damit die Grafikausgabe funktioniert. Ich probiere es immer zuerst ohne Konsole, und wenn es ohne nicht geht, dann gebe ich den Konsolen-Parameter beim Kompilieren dazu.
Und bei machnen Systemen muss man den Grafikmodus erst mal mit clg() aktivieren, aber bei den Robotron-Targets ist das nicht notwendig (es schadet aber auch nicht, wenn man das als Fleißaufgabe macht).
Abschließend: viel Spaß damit. Vielleicht werden wir ja bald das eine oder andere neue Programm sehen. :-)
Quellcode: | /* plot(), Unplot() and Point() Test by RobertK, 2018-11-28 (simple version)
Compile command for the following targets: === Robotron Z1013 (64×64) === zcc +z1013 -lm -create-app plottest.c -o plottest_z1013 Note: top line (plotted pixel at 1,1) was not visible with 1.99B, since nightly build 2018-03-22 it works correctly. === Robotron Z9001 (80x48) === (almost ok) zcc +z9001 -lm -lgfx9001 -o plottest_z9001 -create-app plottest.c or zcc +z9001 -lm -lgfx9001 -subtype=kcc -o plottest_z9001 -create-app plottest.c Use JKCEMU for testing, there you can run either a .TAP or a .KCC file. Note: combining -lgfx9001 and -clib=ansi... zcc +z9001 -lm -lgfx9001 -clib=ansi -o plottest_z9001_ansi -create-app plottest.c ...works only on monochrome systems (on colour machines, characters cannot be seen and plotted points are partly invisible) === Robotron KC85/2..KC85/5 and HC900 (320x256) === (ok) zcc +kc -lndos -pragma-redirect:fputc_cons=fputc_cons_generic -lm -create-app plottest.c -o plottest_kc85 HC900 Issue: program occasionally crashes in the jkcemu emulator. Problem seems to be connected to the "Einfügen von Text direkt in den Tastaturpuffer" option. Could be an emulator problem. */
#include <stdio.h> // required for printf() #include <graphics.h> // contains plot() and point() functions
void myCls() { printf("%c",12); }
void main() { int x,y; int xMax, yMax; int mode; // determine the screen dimensions for this system // coordinates go from 0 to this max value xMax=getmaxx(); yMax=getmaxy(); myCls(); // clear the screen printf("\n\n\n\n\n*** plot test (%d x %d) ***\n\n",xMax+1,yMax+1); printf("press any key to plot and unplot\n\n"); fgetc_cons(); // wait for keypress // clg(); // required on some systems to activate graphics mode plot(1,1); plot(3,3); plot(40,4); plot(5,5); unplot(5,5); plot(7,7);
// On some systems the console has colour support // Usability of this is limited, because a 4x4 block can only have one colour /* for ( y = 0; y < 16; y++ ) { textcolor(y); plot(10,y*3); } */ printf("press any key to point-check\n\n"); fgetc_cons(); // wait for keypress printf("point(3,3) (plotted) is %d\n",point(3,3)); // should be 1 printf("point(40,4) (plotted) is %d\n",point(40,4)); // should be 1 printf("point(5,5) (unplotted) is %d\n",point(5,5)); // should be 0 printf("point(10,10) (blank) is %d\n",point(10,10)); // should be 0
// check if the screen dimensions for this platform have been defined above if (xMax>0 && yMax>0) { printf("\npress any key to draw border\n"); fgetc_cons(); // wait for keypress for (x = 0; x <=xMax; ++x) { plot(x,yMax); plot(x,0); } for (y = 1; y <=yMax; ++y) { plot(0,y); plot(xMax,y); } } printf("\npress any key to clear screen\n"); fgetc_cons(); // wait for keypress
myCls(); // clear the screen xMax=xMax/4; yMax=yMax/4; printf("\n\n\n\n\n*** c_plot test (%d x %d) ***\n\n",xMax+1,yMax+1);
printf("press any key to c_plot and c_unplot\n\n"); fgetc_cons(); // wait for keypress // clg(); // required on some systems to activate graphics mode c_plot(1,1); c_plot(3,3); c_plot(18,4); c_plot(5,5); c_unplot(5,5); c_plot(7,7);
// On some systems the console has colour support // Usability of this is limited, because a 4x4 block can only have one colour /* for ( y = 0; y < 16; y++ ) { textcolor(y); c_plot(10,y*3); } */ printf("press any key to c_point-check\n\n"); fgetc_cons(); // wait for keypress printf("c_point(3,3) (plotted) is %d\n",c_point(3,3)); // should be 1 printf("c_point(18,4) (plotted) is %d\n",c_point(18,4)); // should be 1 printf("c_point(5,5) (unplotted) is %d\n",c_point(5,5)); // should be 0 printf("c_point(10,7) (blank) is %d\n",c_point(10,7)); // should be 0
// check if the screen dimensions for this platform have been defined above if (xMax>0 && yMax>0) { printf("\npress any key to draw border\n"); fgetc_cons(); // wait for keypress for (x = 0; x <=xMax; ++x) { c_plot(x,yMax); c_plot(x,0); } for (y = 1; y <=yMax; ++y) { c_plot(0,y); c_plot(xMax,y); } } printf("\npress any key to clear screen\n"); fgetc_cons(); // wait for keypress
myCls(); // clear the screen printf("done.\n"); fgetc_cons(); // wait for keypress } |
|