
Ü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:
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:
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
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:
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...
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 ^_^:
Druckversion
|
|