QUICK Ecke Teil 15 von Harald Schönfeld Willkommen zur vorläufig letzten Folge der QUICK Ecke! Nach nunmehr 15 Folgen im USER-MAG, 10 QUICK-magazinen und anderen Texten zu QUICK gehen mir doch langsam die Ideen aus. Deswegen hab ich dringend eine Denkpause nötig. Sollte irgend jemand von Euch irgendwelche Ideen haben, worüber ich an dieser Stelle noch schreiben könnte, dann wendet Euch bitte an mich bzw. an Ulf. Nun aber zum Thema dieser Folge und einer der interessantesten Fähigkeiten von QUICK: Mausabfrage in QUICK QUICK ist ja bekanntlich die einzige Sprache für die XL/XE Computer, die einen Befehl zur einfachen Abfrage einer (ST)-Maus bietet. .MOUSE Mit diesem Befehl wird ca. 1/50 Sekunde lang eine im Joystickport 2 sitzende Maus abgefragt. Ihre Bewegungen werden in den Variablen MX (178) und MY (179) festgehalten. Diese beiden Variablen geben die Position der Maus im Bereich von 0 bis 159 (X) und 0 bis 192 (Y) wieder. Die notwendigen Bereichskontrollen übernimmt QUICK. Wie fragt man nun die Maus ab? Das geht in einer ganz einfachen Schleife: REPEAT .MOUSE UNTIL STRIG=0 Dabei ist STRIG die OS-Variable, die den Status des Triggers 2 enthält. Damit wird also die Maus in einer Schleife solange abgefragt, bis ihre linke Taste gedrückt wird. Erst dann soll ja was passieren. In der Schleife werden die Mauskoordinaten MX und MY ständig verändert. Um das auf dem Bildschirm sehen zu können, muß man natürlich einen Mauszeiger darstellen. Der Mauszeiger im VBI Der einfachste Weg ist, den Mauszeiger ständig durch einen VBI darstellen zu lassen. Dazu liest der VBI ständig (also jede 50tel Sekunde am Ende des Bildschirmaufbaus) die Mauskoordinaten MX und MY und setzt einen Player an die entsprechende Position auf dem Bildschirm. Dazu ist jedoch eine Umrechnung nötig, denn der Playerbereich ist ja bezüglich des eigentlichen Playfields verschoben. Sind die Koordinaten umgerechnet wird mit Hilfe des Playerbefehls PLAYER der Speicherbereich in dem die Playerform festgelegt wurde an die richtige Stelle im Playerbereich kopiert, nachdem der Playerbreich vorher ganz glöscht wurde um zu verhindern, daß mehrere Pfeile zu sehen sind. Das BOX-Demo Eine häufige Anwendung der Maus ist neben dem Zeichnen das Anwählen von Boxen auf dem Bildschirm. In diesem Demo werden deshalb 7 Boxen auf den Bildschirm gezeichnet, die dann mit der Maus angeklickt werden können. Die Routine PLAYFILED definert zunächst den Inhalt der ARRAY-Variablen BOXX und BOXY, die die X und Y Positionen der Boxen enthalten. In einer Schleife werden dann an den entsprechenden Stellen die Boxen von der Unterroutine BOX gezeichnet. Wird der Trigger in der Hauptschleife gedrückt, wird die Routine BOXTEST aufgerufen. Diese überprüft in einer Schleife, ob der Mauszeiger an der Position MX, MY in einer der Boxen steht. Ist dies der Fall, so wird ein Blinken dieser Box ausgelöst, indem die Box kurzzeitig in einer anderen Farbe gezeichnet wird. In einem "echten" Programm müßte nun natürlich eine Funktion ausgelöst werden Auf diese Art ist es wirklich problemlos möglich auch viele Boxen abzufragen, und so eine komfortable Bedienung vieler Programme zu erreichen. Ein gutes Beispiel dafür ist z.B. der Zeichensatzeditor QUICK Ed, der ja zusätzlich auch (mit Hilfe der entsprechenden QUICK-Library) mit der Maltafel bedient werden kann. Quick-Sourcetext D1:Q15.QIK ---------------- Length: $093E Free : $6E2D ---------------- *QUICK Ecke 15 * *Mausabfrage-Demo mit Darstellung *eines Mauszeigers (Pfeil) *Laeuft wie immer nur mit einer ST-Maus BYTE +( MX=178,MY=179 *Mausposition TRIG=645 *Trigger 2 +) ARRAY +( BOXX(8),BOXY(8) +) MAIN .PLAYFIELD .INI_PLAYER *Anfangsposition der Maus MX=80 MY=96 REPEAT *Maus solange abfragen, bis Trigger *gedrueckt. Pfeil wird dabei vom VBI *bewegt REPEAT MOUSE UNTIL TRIG=0 *Position der Maus pruefen .BOXTEST UNTIL 1=0 ENDMAIN * VBI zur Darstellung des Mauszeigers INTER MAUSZEIGER LOCAL BYTE +( Y HPOS=53248 *Horiz. Pos. Player 0 +) BEGIN CLR(100,1) *Bereich von Player *0 loeschen ADD(MX,49,HPOS) *Hor. Pfeilpos. ADD(MY,32,Y) *Vert. Pfeilpos. *Player an richtige vertikale Position *kopieren *Adresse=100*256+Y *Datenlaenge=9 *Lesen von Adr.30000 PLAYER(100,Y,9,30000) ENDVBI * Schaltet Playerdarstellung ein * Definiert Playerform PROC INI_PLAYER LOCAL BYTE +( GRAC=53277 *Playerdarstellungskontr. PBASE=54279 *Playerbereich Adr. DMA=559 *Grafikkontr. PCOL=704 *Farbe Player 0 +) BEGIN PBASE=96 *Player an GRAC=3 DMA=62 DATA (30000) *Playerform (Pfeil) +( 128,192,224,240,192,160,160,16,16 +) VBI (MAUSZEIGER) *VBI anschalten PCOL=15 *Farbe ENDPROC * Schaltet GR 15 ein und zeichnet 7 * Boxen PROC PLAYFIELD LOCAL BYTE +( I,X,Y +) BEGIN CLOSE (6) OPEN (6,12,15,"S:") *Graphics 15 SETCOL(4,0,0) COLOR(1) *Boxpositionen DATA(BOXX) +( 30,70,110 30,70,110 70 +) DATA(BOXY) +( 20,20,20 80,80,80 140 +) *Boxen zeichnen I=0 REPEAT X=BOXX(I) Y=BOXY(I) .BOX(X,Y) I+ UNTIL I=7 ENDPROC * Ueberprueft, ob sich die Maus in * einer Box befindet PROC BOXTEST LOCAL BYTE +( I,X,Y +) BEGIN I=0 REPEAT X=BOXX(I) Y=BOXY(I) IF MX>=X ADD(X,20,X) IF MXY ADD(Y,30,Y) IF MY