QUICK Ecke 25 von Harald Schönfeld Na, heute gäb's ja ein richtiges Jubiläum zu feiern: 25 mal QUICK Ecke im UserMag. So ein kühles Glas Sekt wäre jetzt - das Thermometer zeigt 30 Grad - wirklich sehr angebracht. Aber es ist keine Zeit zum Feiern: Die QUICK Ecke muß morgen früh mit der Post weg, weil ich wiedermal alles bis zum letzten Termin aufgeschoben habe. In der letzten Folge habe ich gezeigt wie man die Befehle CUT und PASTE in QUICK benutzen kann. Ich hab' dabei schon ganz kurz anklingen lassen, daß sich diese Befehle auch eignen um Sprites oder einen Mauszeiger in GRAPHICS 8 darzustellen. Heute möchte ich zeigen, wie letzteres funktioniert. MAUSZEIGER IN GRAFIK 8 Will man in QUICK die Maus abfragen, so geht das ganz einfach mit dem MOUSE-Befehl. Dieser Befehl fragt ca. 2/50tel Sekunden lang den PORT 2 ab und nimmt dort Mausbewegungen auf. Ruft man MOUSE in einer Schleife schnell genug immerfort auf, so wird die Maus also gleichmäßig abgefragt und die beiden QUICK-internen Variablen MX (=178) und MY (=179) werden korrekt gesetzt. Bei diesem System gibt es 2 Schwierigkeiten, wenn man einen Mauszeiger in GRAPHICS 8 darstellen will: MOUSE liefert immer nur Werte für MX von 0 bis 159 und MY von 0 bis 191. Da man in GR 8 jedoch X-Positionen von 0 bis 320 hat, wird das etwas kritisch! Außerdem kann man den Mauszeiger nicht mit Hilfe eines Players ganz einfach und von der eigentlichen Grafik unabhängig darstellen. Denn die Payergrafik erlaubt ja auch nur X-Positionen, die 2er Schritten auf dem GR 8-Bildschirm entsprechen. Es müssen also 2 Probleme gelöst werden. DER ERWEITERTE MOUSE-BEFEHL Es wäre sehr aufwendig in QUICK die Mausabfrage "zu Fuß" noch einmal neu zu programmieren. Deshalb werde ich hier einen kleinen Programmteil vorstellen, der es ermöglicht den normalen MOUSE-Befehl zu benutzen und trotzdem X-Werte im Bereich 0 bis 358 zu erreichen (die Position 359 ist leider nicht machbar): Das Grundprinzip ist ganz einfach: Zunächst wird die X-Position MX, die MOUSE liefert, verdoppelt (und in EXMX geschrieben). Damit können wir schon den ganzen Bereich in 2er-Schritten abdecken. EXMX ist die neue Maus-X-Variable. Um nun auch in 1er-Schritten mit der Maus gehen zu können wird der neue MX-Wert mit dem vorherigen Wert (AX) verglichen. Ist der Unterschied nur +/- 1, so wird dieser Wert zu EXMX addiert. Damit ist ein 1er-Schritt genauso in EXMX zu sehen wie in MX. Nun muß aber noch eine Sache unbedingt beachtet werden. Immer wenn EXMX auf diese Art einen geraden Wert erreicht hat, wird dieser durch 2 geteilt und in MX übertragen. Der Grund ist folgender: Nehmen wir an MX wäre 10 mal nur um 1 erhöht worden. Dann wäre auch EXMX nur um 10 erhöht worden. Wird MX nun aber schneller erhöht (z.B. mit einem mal um 5), so wird dieser neue MX-Wert verdoppelt in EXMX geschrieben. EXMX erhöht sich damit aber nicht nur um 2*5, sondern um 2*5+10, da vorher ja immer nur 1 (anstatt 2 wie das richtig wäre) addiert wurde. Aus diesem Grund wird, wenn EXMX künstlich nur um 1 erhöht wurde der Wert von EXMX wenn er gerade ist, in MX kopiert, damit MX nicht "davonrennt". MX wird somit gebremst. Um die Y-Koordinate braucht man sich nicht zu kümmern. Deshalb zeigt EXMY direkt auf MY (d.h. beide liegen bei Adresse 179). DER MAUSZEIGER Der Mauszeiger muß in GR 8 als Software-Sprite angezeigt werden ( so wie das auch auf dem ST oder PC geschieht ). Das Grundkonzept läuft so ab: - Hintergrund unter der Zeigerbox an der Mausposition merken - Mauszeigerbox auf BS kopieren - Maus wird bewegt - Gemerkten Hintergrund an alte Stelle kopieren - Zum Anfang gehen Zunächst muß man sich jedoch die Mausform erst mal irgendwie auf den Bildschirm bringen, damit man sie mit einem CUT-Befehl für später im Speicher aufbewahrt. Ich mache das hier so, daß ich 10 Datenbytes untereinander in die linke obere Ecke des Bildschirms kopiere. Diese 10 Bytes enthalten (wie bei einem Zeichensatz auch) die Formdaten. Dann wird die obere Ecke mit CUT(0,0,5,9,MAUS) ausgeschnitten und an der Adresse MAUS aufbewahrt. MAUS wurde vorher ein Wert zugewiesen, der kurz vor dem Bildspeicher liegt. Nun geht das Programm richtig los. In einer Schleife wird MOUSE aufgerufen. Damit sich die Maus nicht zu langsam bewegt, wird MOUSE gleich 2 (oder wenn man will mehrmals) aufgerufen. Dadurch wird sie zwar ein bißchen ruckelig (aber auf den PC's sieht das auch nicht besser aus, auf dem ST dagegen schon). Dann wird überprüft, ob sich die Maus wirklich bewegt hat. Denn nur dann ist es nötig sie neu zu zeichnen, damit es nicht unnötig flackert. Wurde sie bewegt, so wird der voher gemerkte Hintergrund an die alte Mausposition kopiert. Dann wird der Hintergrund der neuen Mausposition gesichert (an der Adresse SAVE) und schließlich wird der Mauszeiger mit PASTE an der neuen Stelle eingesetzt. Hier ist zu beachten, daß PASTE im Modus 1 benutzt wird. Der Mauszeiger wird also im ODER-Modus auf den Bildschirm kopiert. Der Grund ist klar: Der Mauspfeil füllt ja nur einen Teil des 5x9 Pixel großen PASTE-Rechtecks aus. Würde man im REPLACE-Modus arbeiten, so würde das Kästchen sichtbar, weil die Box um den Zeiger herum völlig leer wäre. Das sähe aber nicht schön aus. Und schon sind wir fertig. Der Mauszeiger flitzt über den Bildschirm wie der auf anderen Computern. Damit ist es kein Problem mehr, die Maus bei Programmen pixelgenau zu verwenden, die Grafik 8 benutzen. Z.B. kann man nun in QUICK ganz leicht ein monochromes Grafikprogramm programmieren ( im Stil von SAM Designer ). Wie das geht zeige ich dann in der nächsten Folge. Hier aber zunächst der Quelltext des heutigen Beispiels: * MAUS-SPRITE * (c) 1992 by H.Schoenfeld * fuer UserMag QUICK Ecke 25 BYTE (+ MX=178,MY=179 AX,AY,TST,CY SPEED,I )+ WORD (+ SAVMSC=88 EXMX,AEXMX,CX MAUS,SAVE )+ MAIN * Mausposition 0,0 MX=0 AX=0 MY=0 AY=MY EXMX=MX AEXMX=EXMX SPEED=2 2 mal MOUSEn CLOSE(6) OPEN(6,8,8,"S:") Grafik 8 .INITARR REPEAT I=0 REPEAT MOUSE I+ UNTIL I=SPEED SUB(MX,AX,TST) IF TST=1 nur +1? ADD(EXMX,1,EXMX) AND(EXMX,1,TST) IF TST=0 DIV(EXMX,2,MX) ENDIF ELSE IF TST=-1 SUB(EXMX,1,EXMX) nur -1? AND(EXMX,1,TST) IF TST=0 DIV(EXMX,2,MX) ENDIF ELSE IF TST<>0 MX*2 in EXMX MULT(MX,2,EXMX) ENDIF ENDIF ENDIF IF MY>184 unterer Rand für MY MY=184 ENDIF IF AEXMX<>EXMX Maus bewegt? JUMP(1) ELSE IF AY<>MY JUMP(1) ENDIF ENDIF JUMP(2) -1 * alten Hintergrund herstellen PASTE(0,AEXMX,AY,SAVE) * neuen merken ADD(EXMX,5,CX) ADD(MY,9,CY) CUT(EXMX,MY,CX,CY,SAVE) * Mauszeiger anzeigen PASTE(1,EXMX,MY,MAUS) -2 * lezte Mauspos. merken AX=MX AY=MY AEXMX=EXMX UNTIL 1=0 ENDMAIN PROC INITARR LOCAL ARRAY (+ TMP(10) )+ WORD (+ ADR )+ BYTE (+ I,B )+ BEGIN DATA(TMP) (+ 128,192,224,240,248,252,48,48,24,24 )+ * Speicherbereiche für CUT festlegen SUB(SAVMSC,400,MAUS) SUB(MAUS,50,SAVE) * Hintergrund merken ADD(EXMX,5,CX) ADD(MY,9,CY) CUT(EXMX,MY,CX,CY,SAVE) * Mauszeigerbytes in BS kopieren ADR=SAVMSC I=0 REPEAT B=TMP(I) POKE(ADR,B) ADD(ADR,40,ADR) I+ UNTIL I=10 * Mauszeiger ausschneiden für später CUT(0,0,5,9,MAUS) ENDPROC Zum Schluß noch eine Korrektur zur "Geschichte von ATARI" aus dem vorletzten UserMag: Den ATARI-Explorer ( ATARIs Hauszeitschrift aus den USA ) gibt es nach wie vor. Dort kann man Berichte über den ST, den Portfolio und das LYNX lesen. Selbst die 8-Bitter werden hin und wieder erwähnt.