ON KEY (TSB)/Anwendungsbeispiel
<< zurück zu ON KEY (TSB)
Hier eine umfangreich kommentierte Kurzanwendung des Befehls ON KEY. Die Idee dazu entstand vor einiger Zeit im Forum64. Die Programmteile können hier kopiert und in einen Emulator wie z.B. VICE direkt eingespeist werden. Die in geschweifte Klammern gesetzten Zeichen müssen dann aber von Hand ersetzt werden. Der hier verwendete Zeichensatz befindet sich auf der TSB-Demo-Diskette und stammt aus dem 64'er Magazin-Ausgabe 5/88. Er wurde entworfen von Ralph Schmieder.
Programm "forum64.tsb"[Bearbeiten | Quelltext bearbeiten]
Start des Programms, Einbinden eines fensterorientierten Zeichensatzes und in Zeile 30 Definieren der ON-KEY-Hotkey-Tasten und deren Auswertung (siehe unten). Die zulässigen Tasten sind die vier Cursortasten und die Tasten g , w , s , l , o und x und Return ,:
10 dr=use 13 if display <>$cc00 then do 14 mem: print "wait..." 15 load "zeichensatz",dr,0,$e800 17 done 20 init 30 on key k$:disable:auswertung:resume
Da mit MEM auf einen neuen Zeichensatz umgeschaltet wird, verhindern die Zeilen 13 bis 17, dass dieser bei jedem RUN neu geladen wird. Ist DISPLAY auf $CC00, ist der Zeichensatz bereits initialisiert.
Zeile 20 ruft die Variablen-Initialisierung (in Zeile 10000 ff) auf:
10000 proc init 10010 dim a$(2),mn,um,zl,sp,br,ho,f,im,x,c,bt 10020 sp=1: f=11: um=1: mn=1 10025 k$="{left}{up}{right}{down}gwslox"+chr$(13) 10030 a$(0)="{c=+}{c=t}{c=i}{c=g} {c=l}{c=-}{c=k}{shift-}" 10040 a$(1)="{c=c}{c=e}{c=x}{c=f} {c=u}{c=v}{c=r}{c=b}" 10050 a$(2)="{c=m}{c=pfund}{shift pfund}{c=g} {c=n}{c=z}{c=@}{c=s}" 10060 print "{clear}{ctrl n}{ctrl h}";: colour 11,1,f 10070 fill 0,0,40,25,96,f 10080 mbar 10090 end proc
In A$(..) befinden sich die Fenster-Definitionen, im folgenden Bild besser erkennbar (die Variable A$(0) - ein windows-ähnliches Fenster - wird im Programm nicht verwendet):
Die Zeilen 10060 bis 10080 erzeugen die Benutzeroberfläche des Programms, zuerst die Farben, dann den Hintergrund und zum Schluss den Menübalken:
Dann definieren wir die Routinen, mit denen die Menünavigation visualisiert wird: Erzeugen einer Menübox ("MBOX"), erzeugen des Menübalkens ("MBAR", der in INIT schon verwendet wurde) und erzeugen eines beliebigen Fensters ("BOX"):
600 proc mbox 610 inv 0,sp,6,1 620 fill 1,1,20,6,96,f 630 insert a$(2),zl,sp,br+2,ho,f 640 end proc 700 proc mbar 710 print "{home} Datei Grafik " 720 end proc 650 proc box 670 insert a$(bt),zl,sp,br,ho,f 680 end proc
Wobei Zeile 610 die Menü-Überschrift markiert und Zeile 620 vorherige Kästen vom Bildschirm weglöscht. Die INSERT-Befehle erzeugen mit A$(..) die entsprechenden Kästen.
Jetzt kommt der wichtigste Teil des Programms, die Routine, die die ON-KEY-Tastendrücke auswertet:
9000 proc auswertung 9010 c=peek($c5ec): poke $c5ec,0 9020 if c=29 then t=3 9025 if c=157 then t=7 9030 if c=17 then t=5 9035 if c=145 then t=1 9040 if c=13 then t=128: if mn=0 then t=7 9045 if c=87 then im=-1: mn=2: um=2 9050 if c=71 then im=-1: mn=2: um=1 9055 if c=79 then im=-1: mn=2: um=3 9060 if c=76 then im=-1: mn=1: um=1 9065 if c=83 then im=-1: mn=1: um=2 9070 if c=88 then t=128 9080 end proc
Diese Routine wird nach dem ON KEY in Zeile 30 bei jedem beliebigen Tastendruck aufgesucht. Sie holt die von ON KEY registrierten Tastendrücke aus der Speicherstelle $C5EC ab (in die Variable C) und löscht die Übergabestelle sofort (geschieht nicht automatisch!) Danach werden die CHR$-Werte der Tastendrücke mit Bedeutung versehen. Da das Programm auch mit einem Joystick bedient werden kann, hält es in der Variablen T die entsprechenden Richtungen fest: 1 = nach oben, 3 = nach rechts, 5 = nach unten und 7 = nach links, Feuer ist 128 (Zeilen 9020 bis 9040). Die Zeilen 9045 bis 9070 reagieren auf die oben genannten Hotkeys. Hier legen wir mit MN und UM das jeweils aufzurufende Menü und Untermenü fest. IM ist das Aktivierungsflag, auf das in Zeile 240 reagiert wird (siehe unten). Dies alles geschieht aus der Hauptprogrammschleife zwischen den Zeilen 100 und 250 heraus:
100 repeat: x=0: if joy(2) then t=joy(2) 190 if t=128 then x=t 200 if t=3 then im=-1: mn=mn+1: um=1: if mn>2 then mn=2 210 if t=7 then im=-1: mn=mn-1: um=1: if mn<1 then mn=1 220 if t=1 then um=um-1: im=-1 230 if t=5 then um=um+1: im=-1 240 if im then verteiler: im=0: t=0 250 until x
Hier (in Zeile 100) fragen wir einen Joystick in Port 2 ab (JOY(2)). Wird er nicht bewegt, liefert JOY eine Null, ansonsten in der Variablen T die genannten Werte von 1 bis 7 und 128 für Feuer. Auch hier ist IM das Aktivierungsflag für eine Änderung in der Menünavigation. Und genau dann, wenn etwas geändert wurde, tritt die Abfrage in Zeile 240 in Kraft und ruft die Routine "verteiler" auf, um zu entscheiden, welche Aktion nun durchgeführt werden soll (wobei die Zeile 305 nur eine Kontrollroutine ist, die die letzte Cursorbewegung anzeigt, sie kann auch weggelassen werden):
300 proc verteiler 305 if t<>tt then insert a$(1),2,22,6,3,f: print at(3,23)t: tt=t 310 if mn=1 then menue1 320 if mn=2 then menue2 340 end proc
Hier verzweigt das Programm je nach Inhalt der Variablen MN für das aktuelle Menü eben dorthin, zu "menue1" oder "menue2":
400 proc menue1 405 if um<1 then um=2 407 if um>2 then um=1 409 mbar 410 br=9: sp=1: zl=1: ho=4: mbox 440 print at(zl+1,sp+1)"Laden" 460 print at(zl+2,sp+1)"Speichern" 480 inv um+1,sp+1,br,1 490 end proc 500 proc menue2 505 if um<1 then um=3 507 if um>3 then um=1 509 mbar 510 br=6: sp=7: zl=1: ho=5: mbox 540 print at(zl+1,sp+1)"Gas" 550 print at(zl+2,sp+1,)"Wasser" 560 print at(zl+3,sp+1,)"Strom" 580 inv um+1,sp+1,br,1 590 end proc
Die Zeilen 405 bis 409 (und ebenso 505 bis 509) steuern die Umläufigkeit der Navigation: Ist man ganz unten und geht weiter nach unten, kommt man ganz oben im Menü an. Die Zeile 410 (510) öffnet den Menükasten und die folgenden Zeilen füllen ihn mit Inhalt. Der aktuelle Menüpunkt wird in Zeile 480 (580) hervorgehoben.
Man verlässt das Programm mit der Taste x , wobei in Zeile 270 bei einem bestimmten letzten Menüpunkt ("Wasser") ein Fenster geöffnet wird, nur um zu zeigen, dass hier das Programm weitergehen könnte (die Variable BT steht für "Boxtype"):
255 260 fill 1,1,20,6,96,f: mbar: print at(12,0)""; 270 if mn=2 and um=2 then zl=3: sp=3: br=20: ho=15: bt=2: box 280 295 end
Hier ein Screenshot, bei dem sich das Programm in Aktion befindet. Rechts im kleinen Fenster sieht man, was Zeile 305 macht. Es wurde zuletzt eine Bewegung nach oben durchgeführt.
Mit den Hotkey-Tasten (fast immer die Großbuchstaben) würde man direkt in die entsprechenden Menüs gelangen, mit w also in das angezeigte Menü (da das "S" zweimal vorkommt, gilt für den Menüpunkt "Strom" das o .
Viel Vergnügen!