Übersicht
Einleitung
1. Grundlagen
2. Variablen
3. Schleifen
4. Entscheidungen
5. Struktur
6. Eingabe
7. Gfx-Grundlagen
8. Bilder anzeigen
9. Kollision
10. Sound & Musik
11. Dateien
12. Multiplayer



Spiele
Grafik
Mathe
Netzwerk
String
Verschiedenes

Eingabe


© Robert Gerlach 2001-2002

www.robsite.de



Die einfachste Art der Eingabe haben wir schon im Grundlagen-Kapitel gehabt, Input. Da man aber, außer in Textadventures, nur noch selten eine Nummer eintippt und Enter drückt um weiterzukommen, hat BB viele schöne Befehle um alle möglichen Eingabegeräte abzufragen.




Tastatur


Jede Taste auf der Tastatur hat einen eigenen Code, den Scancode (auch Tastaturcode genannt). Diesen darf man nicht mit dem ASCII-Code verwechseln, da dieser nur für die verschiedenen Zeichen (Buchstaben, Zahlen, aber auch Tasten wie Strg oder Alt) steht und nicht für die Tasten. Ziemlich verwirrend...^_^'
Die verschiedenen Scancodes findet man in der BB-Documentation unter Command Reference / Miscellaneous / Scancodes (listing).
Auch kann man in BB, anders als z.B. mit QBasic, mehrere Tasten (> 6) gleichzeitig abfragen.
Wenn man nun abfragen will ob eine bestimmte Taste einmal kurz gedrückt wurde, nehme man:


KeyHit(scancode)

; Als Abfrage:
 If KeyHit(scancode) = 1 Then /Aktion\
; oder einfach:
 If Keyhit(scancode) Then /Aktion\



Wenn man jetzt trotzdem die Taste gedrückt lässt, passiert nichts weiter, denn es wird ja nur geprüft ob die Taste einmal gedrückt wurde...

Für viele Spiele und Programme muss man aber prüfen ob eine Taste die ganze Zeit gedrückt ist:


KeyDown(scancode)


Diese beiden Befehle geben 1 zurück wenn die entsprechende Taste gedrückt wurde und 0 wenn nicht.
Manchmal braucht man aber auch den ASCII-Code einer gedrückten Taste. Diesen bekommt man mit GetKey() raus:


ascii_code = GetKey()



GetKey ist in etwa das gleiche wie INKEY$ in QBasic. Da es aber ASCII-Codes verwendet, sollte man doch lieber KeyHit() und KeyDown() nehmen, es ist einfacher damit wichtige Tasten, wie z.B. die Pfeiltasten, abzufragen.



Alle gedrückten Tasten kommen erstmal in eine "Warteschlange", in der sie solange warten bis sie durch einen der obigen Befehle abgefragt werden. Das kann dazu führen dass man schon was völlig anderes macht und trotzdem noch die alten Scancodes in der Schlange ausgewertet werden. Um das zu vermeiden kann man sie mit


FlushKeys


löschen um wieder Platz für neue Tastendrücke zu machen.

Der letzte Tastaturbefehl wartet solange bis man irgendeine Taste gedrückt hat und liefert dann den Ascii-Code der gedrückten Taste:


taste = WaitKey()



Aber es gibt noch mehr Eingabegeräte die man abfragen kann, z.B. die Maus.



Maus


Die Maus muss man nicht extra aktivieren, man braucht nur die Koordinaten abfragen und bei Bedarf einen Mauszeiger (ein einfaches Bild) an die Position zeichnen, es gibt keinen Standardcursor der automatisch erscheint.
Die Mausskoordinaten sind diese:


x_Koordinaten = MouseX()
y_Koordinaten = MouseY()



Will man wissen welche Maustaste gerade gedrückt wird, nehme man:


; Prüft ob mit der Maustaste |x| einmal kurz geklickt wurde:
If MouseHit(x) Then /Aktion\

; Prüft ob Maustaste-x die ganze Zeit gedrückt wird:
If MouseDown(x) Then /Aktion\


Im Prinzip das gleiche wie KeyHit() und KeyDown(). x steht hier für eine der 3 prüfbaren Maustasten: 1 für die linke, 2 für die rechte und 3 für die mittlere, welche meistens das Mausrad ist. Man kann aber nur prüfen ob es gedrückt wurde, nicht das drehen des Rades. Hierfür gibt es seit Version 1.60 eigene Befehle. Mit ihnen kann man allerdings nicht prüfen ob die Maus überhaupt ein Mausrad hat und wenn ja, ob der Treiber dazu auch mitspielt. Man sollte also, wenn man nicht nur ein Programm für sich selbst schreibt, eine Version mit und eine ohne Mausradunterstützung schreiben:


; Gibt die "Position" des Mausrades zurück:
mausradposition = MouseZ()

; Gibt die Geschwindigkeit des Rades zurück, also die Strecke die es seit dem letzten Aufruf des Befehls zurückgelegt hat. Daher sollte man MouseZSpeed möglichst nur einmal in einem Durchgang verwenden, da sich ja bei jedem Aufruf die Werte aktualisieren:
mausradgeschwindigkeit = MouseZSpeed()


Wie bei der Tastatur gibts auch hier eine Alternative, nämlich GetMouse():


gedrueckter_mausbutton = GetMouse()



Noch eine sehr nützliche, weil aufwändig selbst zu programmierende, Funktion ist:


maus_x_geschwindigkeit = MouseXSpeed()
maus_y_geschwindigkeit = MouseYSpeed()


Hiermit kann man sehr einfach die Strecke feststellen, die die Maus seit dem letzen Aufruf von MouseX/YSpeed zurückgelegt hat, also ihre Geschwindigkeit. Dabei muss man den jeweiligen Befehl natürlich zweimal ausführen (z.B. in einer Schleife, mit 2 Durchläufen). MouseZSpeed funktioniert genauso.

Man kann die Mauskoordinaten aber auch selbst (also im Programm) verändern, z.B. um den Cursor automatisch auf einen OK-Button zu befördern...


MoveMouse x, y


Der Rest an Mauskommandos besteht wieder aus FlushMouse und WaitMouse(), das gleiche wie bei der Tastatur. Statt WaitMouse() kann man auch MouseWait() nehmen, es gibt keinen Unterschied. Warum auch immer...


; Leert die "Warteschlange" der Mausaktionen:
FlushMouse

; Wartet auf Maustastendruck und gibt danach den Code der gedrückten Maustaste zurück:
mausbutton = WaitMouse()
; oder
mausbutton = MouseWait()




Man kann auch noch einen Joystick mit 13 verschiedenen Befehlen abfragen, aber da nicht jeder einen Joystick hat und es somit nicht unbedingt notwendig ist, lass ich das jetzt mal aus. Wer sich die Befehle mal angucken will, wird in der BB-Documentation unter Command Reference / Input fündig.







Zusammenfassung


; Um zu überprüfen ob eine Tastatur-Taste einmal kurz gedrückt wurde nehme man:
If KeyHit(scancode) Then ....


; Um zu überprüfen ob eine Tastatur-Taste die ganze Zeit runtergedrückt wird:
If KeyDown(scancode) Then ....


; Den ASCII-Code (nicht den Scancode) einer Taste bekommt man mit:
ascii_code = GetKey()


; Um die Tastatur-Warteschleife zu löschen:
FlushKeys


; Mit WaitKey wartet das Programm solange bis man irgendeine Taste gedrückt hat. Außerdem wird der ASCII-Code der Taste zurückgeliefert:
taste = WaitKey()




; Die Mauskoordinaten prüft man mit:

x = MouseX()
y = MouseY()


; Auf gedrückte Maustasten kann man so überprüfen:
If MouseHit(x) Then ...

; und

If MouseDown(x) Then ...

; x steht für: 1 - links, 2 - rechts, 3 - mitte


; Das gleiche bloß andersrum kann man mit GetMouse() machen:
gedrueckte_Maustaste = GetMouse()


; Die Geschwindigkeit der Maus (in Pixeln seit dem letzten Aufruf des Befehls) bekommt man mit:
x_speed = MouseXSpeed()
y_speed = MouseYSpeed()


; Um die Maus unabhängig vom Benutzer zu bewegen, nehme man:

MoveMouse x, y


; Um den Maustasten-Speicher zu löschen gibts:
FlushMouse


; Falls man das Programm solange anhalten will bis die Maus bewegt wird:
mausbutton = WaitMouse()

; oder

mausbutton = MouseWait()




Im nächsten Kapitel gehts dann endlich um Grafik ^_^:


Teil 7: Grafikgrundlagen



Druckversion