^3Ŀ ^3^0The Real Adok's Way to QBASIC^3 ^3^0 A new Method Step by Step ^3 ^3 ^3^4 ^3 ^3^4 ^3 ^3^4 ^3 ^3 Willkommen zum siebten Teil von The Real Adok's Way to QBASIC! Heute geht es um die Grafikprogrammierung. Uff, das wird umfangreich sein! Fangen wir also am besten gleich an. Wenn wir die Grafikfunktionen ntzen wollen, mssen wir zunchst mit dem ^4SCREEN^5-Befehl in den Grafikmodus umschalten. Da es verschiedene Grafikmodi gibt, mu als Parameter die Nummer des gewnschten Modi angegeben werden. Die gebruchlichsten Grafikmodi sind: ^408..........^0Textmodus, 16 Farben, acht Bildschirmseiten, keine Grafik. ^498..........^0EGA-Grafik, Grafikauflsung 640x350 Pixel, 16 Farben, zwei Bild- ^0schirmseiten, eingebaute Farbpalette nicht so schn wie in Mode 12. ^4128.........^0VGA-Grafik, Grafikauflsung 640x480 Pixel, 16 Farben, eine Bild- ^0schirmseite. ^4138.........^0VGA-Grafik, Grafikauflsung 320x200 Pixel, 256 Farben, eine Bild- ^0schirmseite, in Power Basic nicht anwhlbar! Dazu bedarf es einiger Klrung. Obwohl der Text auch in den Grafikmodi an- gezeigt werden kann, wird trotzdem oft auch weiterhin der reine Textmodus (0) verwendet. Dies kann verschiedene Grnde haben, etwa die Geschwindigkeit der Textausgabe, Textauflsung oder die Anzahl der Bildschirmseiten (wie es auch bei diesem Viewer der Fall ist!). In Basic lt sich auerdem in den VGA- Modi die Hintergrundfarbe nicht auswhlen; der Text wird immer in Farbe 0 (normalerweise schwarz) hinterlegt, der alte Hintergrund gnadenlos ber- schrieben. Wie sich das verhindern lt, kann ja in Hugi #3 nachgelesen werden (dort isses aber ein C-Listing). Die Grafikauflsung gibt an, aus wievielen Punkten der Bildschirm aufgebaut ist. Ein Wert von 640x350 gibt beispielsweise an, da sich in der horizontalen Richtung pro Zeile 640 Bildpunkte ansprechen lassen und es 350 Zeilen gibt. Der Wert bei den Farben gibt die Anzahl der verschiedenen Farben an, die sich gleichzeitig darstellen lassen. Der Begriff 'Bildschirmseiten' mag schlielich etwas ungewhnlich klingen, aber: Nomen est Omen! Es lassen sich sozusagen mehrere 'logische' Bildschirme im Speicher der Grafikkarte anlegen, von der immer eine auf den 'physikalischen' Bildschirm kopiert wird. Syntax des Screen-Befehls: ^0SCREEN Modus, Farbe, ASeite, VSeite^5 . Der Parameter ^1Modus^5 steht hierbei fr die Nummer der Bildschirmseite. ^1Farbe^5 ist nur in den Modi 0 und 1 von Bedeutung, deshalb geben wir diesen Parameter entweder gar nicht an oder setzen ihn auf 0. ^1ASeite^5 schlielich ist die Nummer der Bild- schirmseite von 0 bis zur Anzahl der Bildschirmseiten minus 1, auf die geschrieben werden soll, und ^1VSeite^5 die Nummer der Seite, die gerade auf dem Bildschirm dargestellt werden soll. Im Normalfall will man sowieso nur den Modus wechseln und braucht sich um die zustzlichen Parameter nicht zu kmmern. So, genug mit dem Gelaber. Ich verffentliche nun ein Beispielprogramm, damit das Ganze verstndlicher wird. Es wird der Grafikbefehl ^4PSET^5 verwendet. Mit seiner Hilfe lassen sich Bildpunkte in einer beliebigen Farbe "setzen". Die Farbe kann entweder direkt als Parameter angegeben, oder sie mu vorher durch COLOR festgelegt werden. Die genaue Syntax lautet: ^0PSET (XKoordinateDesBildpunkts, YKoordinateDesBildpunkts), Farbe Damit keine Probleme auftauchen: Bei ALLEN Grafikbefehlen mu immer zuerst die X-Koordinate angegeben werden. Bei LOCATE war das ja genau umgekehrt, wie wir es (hoffentlich) noch bestens wissen. ^0'PSET-Demo ^0SCREEN 12 'VGA-Grafikmodus 640x480 gewhlt ^0COLOR 13 'Pink ^0PSET (100, 100) 'Farbe vorher gewhlt ^0PSET (320, 200), 14 'Farbe direkt angegeben Wir werden in unseren Beispielprogrammen immer im Grafikmodus 12 arbeiten. Falls ihr nur eine EGA-Grafikkarte besitzt, benutzt einfach den hnlichen Grafikmodus 9. Es gibt dann noch den Befehl ^4PRESET^5. Er funktioniert genauso wie PSET, nur wird, wenn die Farbe nicht direkt angegeben wird, die aktuelle Hintergrund- farbe verwendet. In den VGA-Modi ist diese, wie bereits gesagt, immer Schwarz. Der nchste wichtige Grafikbefehl ist ^4LINE^5. Mit seiner Hilfe lassen sich, wie der Name sagt, Linien zeichnen. Das ist brigens nur eine seiner vielen Anwendungsmglichkeiten, wie wir gleich sehen werden. Die Syntax entspricht der von PSET, nur mssen zwei Koordinaten angegeben werden. Gleich ein Beispielprogramm: ^0'LINE-Demo ^0SCREEN 12 'VGA-Grafikmodus 640x480 gewhlt ^0COLOR 13 'Pink ^0LINE (100, 100)-(320, 200) 'Farbe vorher gewhlt ^0LINE (80, 400)-(420, 400), 14 'Farbe direkt angegeben Experimentiert ein wenig mit den Koordinaten, um die Anwendung dieses Befehls zu erlernen. Kommen wir nun zur anderen Anwendung von LINE. Mit LINE lassen sich auch ^4Rechtecke^5 zeichnen. Man kann sogar angeben, ob die Rechtecke ausgefllt werden sollen oder nicht. Falls sie ausgefllt werden sollen, mu man nach Angabe der Farbe ^0, BF^5 schreiben. Falls nicht, gengt ^0, B^5. Wenn ihr die Farbe nicht direkt angeben wollt, sondern die in COLOR angegebene bernehmen wollt, so lat sie einfach weg! Der Beistrich mu aber schon geschrieben werden. Dazu gleich ein Beispiel. ^0'LINE-Demo mit B- und BF-Option ^0SCREEN 12 'VGA-Grafikmodus 640x480 gewhlt ^0COLOR 13 'Pink ^0LINE (10, 200)-(600, 400), , B 'Nicht ausgeflltes Rechteck ^0COLOR 15 'Leuchtend-Wei ^0LOCATE 24, 1 'Meldung ausgeben ^0PRINT "Nicht ausgeflltes Rechteck" ^0PRINT "Beliebige Taste drcken..." ^0a$ = INPUT$(1) ^0CLS 'Bildschirm lschen ^0COLOR 13 'Pink ^0LINE (10, 200)-(600, 400), , BF 'Ausgeflltes Rechteck ^0COLOR 15 'Leuchtend-Wei ^0LOCATE 24, 1 'Meldung ausgeben ^0PRINT "Ausgeflltes Rechteck" ^0PRINT "Beliebige Taste drcken..." ^0a$ = INPUT$(1) Wie ihr seht, wird in unserem Beispielprogramm zwischen den Grafik- und den Textausgaben immer die Farbe umgeschaltet. Da wrde eine direkte Farbanwahl doch Sinn machen! Ich habe das deshalb gleich realisiert. Das Ergebnis lautet: ^0'LINE-Demo mit B- und BF-Option ^0SCREEN 12 'VGA-Grafikmodus 640x480 gewhlt ^0COLOR 15 'Leuchtend-Wei ^0LINE (10, 200)-(600, 400), 13, B 'Nicht ausgeflltes Rechteck ^0LOCATE 24, 1 'Meldung ausgeben ^0PRINT "Nicht ausgeflltes Rechteck" ^0PRINT "Beliebige Taste drcken..." ^0a$ = INPUT$(1) ^0CLS 'Bildschirm lschen ^0LINE (10, 200)-(600, 400), 13, BF 'Ausgeflltes Rechteck ^0LOCATE 24, 1 'Meldung ausgeben ^0PRINT "Ausgeflltes Rechteck" ^0PRINT "Beliebige Taste drcken..." ^0a$ = INPUT$(1) Nun mte euch klar sein, wozu eine direkte Farbanwahl gut ist: Wenn in einem Programm der Text in einer anderen Farbe als die Grafik ausgegeben werden soll, so ist es praktisch, die Textfarbe mit COLOR festzulegen und die Grafik- farbe immer direkt anzugeben. Der nchste Befehl ist ^4CIRCLE^5. Mit ihm lassen sich Kreise zeichnen. Als Parameter mssen der Mittelpunkt, der Radius und bei direkter Farbanwahl die Farbe angegeben werden. Zu dem Resultat sei nur gesagt, da QBasic automatisch die Werte "nachkorrigiert", so da der Kreis auch wie ein Kreis aussieht. Die Koordinaten stimmen deshalb nicht immer mit den Werten, die ihr durch den Mittelpunkt und den Radius errechnen knnt, berein. Wie immer, hier ein Beispiel. ^0'CIRCLE-Demo ^0'Variablen ^0MPunktX = 320 ^0MPunktY = 200 ^0Radius = 100 ^0'Hauptprogramm ^0SCREEN 9 'EGA-Grafikmodus 640x350 ^0CIRCLE (MPunktX, MPunktY), Radius, 15 'Kreis zeichnen ^0'Beweis, da die von Hand errechneten Koordinaten nicht mit den ^0'tatschlichen bereinstimmen: ^0LINE (MPunktX - Radius, MPunktY)-(MPunktX + Radius, MPunktY), 14 ^0LINE (MPunktX, MPunktY - Radius)-(MPunktX, MPunktY + Radius), 14 Bei dem Befehl CIRCLE gibt es keinen Fill-Parameter. Trotzdem lassen sich Kreise und andere Gebilde ausfllen, und zwar mit dem Befehl ^4PAINT^5. Das Ganze funktioniert so hnlich wie die Flloptionen in diversen Grafikprogrammen. Es mssen ein Startpunkt, bei dem das Fllen begonnen werden soll, die Ausfll- farbe und die Randfarbe angegeben werden. Die Randfarbe gibt an, wo das Aus- fllen gestoppt werden soll. Man mu also eine Art "Kfig" in dieser Randfarbe zeichnen, bevor man PAINT verwendet. Sonst wird der ganze Bildschirm aus- gefllt. Beim Ausfllen eines Kreises sind diese Parameter sonnenklar: Start- punkt entspricht dem Mittelpunkt, Ausfllfarbe und Randfarbe der Farbe des Kreises. Dazu gleich ein Beispiel. ^0'PAINT-Demo ^0SCREEN 12 ^0LOCATE 2, 32 ^0PRINT "Das ist PFLAUMI!" ^0CIRCLE (320, 200), 100, 9 'Kopf ^0PAINT (320, 200), 9, 9 ^0CIRCLE (280, 166), 30, 14 'Linkes Auge ^0PAINT (280, 166), 14, 14 ^0CIRCLE (360, 166), 30, 14 'Rechtes Auge ^0PAINT (360, 166), 14, 14 ^0CIRCLE (280, 166), 10, 2 'Linke Pupille ^0PAINT (280, 166), 2, 2 ^0CIRCLE (360, 166), 10, 2 'Rechte Pupille ^0PAINT (360, 166), 2, 2 ^0LINE (320, 180)-(320, 240), 15 'Nase ^0LINE (260, 220)-(320, 280), 4 'Mund ^0LINE (320, 280)-(380, 220), 4 Lustiges Gesicht, nicht wahr? Eine weitere Option, die man bei ALLEN bisher besprochenen Grafiken einsetzen kann, heit ^4STEP^5 und gibt an, da die nchsten Bildschirmkoordinaten nicht absolut, sondern relativ zur letzten Bildschirmkoordinaten sind. Positive Koordinaten bedeuten, da sich der Bildpunkt um die angegebene Zahl von Punkten rechts unten vom letzten Bildpunkt befindet. Negative Koordinaten dagegen geben an, da sich der neue Bildpunkt links oben von dem alten befindet. Dadurch lassen sich Polygone (Vielecke) sehr einfach mit dem LINE- Befehl zeichnen, denn wenn STEP verwendet wird, kann der Startpunkt, von dem die Linie ausgeht, weggelassen werden. Da der umfangreiche ^4DRAW^5-Befehl schon in Hugi #5 von Karma Sutra ausfhrlich besprochen wurde, wre es beinahe eine reine Wiederholung, wenn wir ihn auch im Rahmen dieses Kurses besprechen sollten. Vielleicht noch eine Ergnzung von LeidPen, wie man sich einige Draw-Kommandos leichter merken kann: ^4U ^5up ^4L ^5left ^4H ^5home, Holland ^4G ^5Gibraltar ^4D ^5down ^4R ^5right ^4E ^5Estland ^4F ^5finis Somit sind wir also fertig mit den grundlegenden GFX-Befehlen. Wie man eine eigene Farbpalette definiert, knnt ihr im Hugi #2 im Artikel "Fading in Basic" nachlesen.