Die Tastatur (Teil 2)
Heute werden wir die 2. Lektion ausweiten. Vorraussetzung, um das zu verstehen ist natürlich das Verständnis der Lektionen davor.
a) Weitere Verwendung von kbhit()
Wie zuvor schon angesprochen, können wir kbhit() auch noch anders verwenden. Das nächste Projekt sollte 'key3' heissen.
// C Source File
// Created 30.08.04; 15:43:32
#include [tigcclib.h]
// Haupt-Funktion
void _main(void)
{
// Lösche Bildschirminhalt
clrscr();
// Schrifgröße auf 'klein' stellen
FontSetSys(F_4x6);
// In einer 'while'-Schleife wird auf einen Tastendruck gewartet
while (!kbhit())
// Schreibe "Drück' Enter!!" auf den Bildschirm
printf("Drück' Enter!!\n");
if (ngetchx() == KEY_ENTER)
// Unser Benutzter ist unseren Anweisungen gefolgt
printf("\n\n\nNa endlich!!!!\n");
else
// Da müssen wir ihn wohl ermanen :)
printf("\n\n\nDu wirst es wohl nie lernen....");
// Auf Tastendruck warten
ngetchx();
}
Wir vorher beschrieben, leert
kbhit() den Tastaturspeicher nicht, d.h.
ngetchx() 'denkt', dass eine Taste gedrückt wird und gibt so den entsprechenden Wert zurück (den wir ja auf KEY_ENTER hin prüfen). Danach wird der Speicher von
ngetchx() entleert, so dass wir als nächstes mit ngetchx() ganz gewohnt warten können, bis sich der Benutzer das Ergebnis angesehen hat. Also hätten wir bei 'key2' auch zweimal
ngetchx() statt GKeyFlush() benutzten können.
Doch was bringt mir
kbhit()? Nun ja, ihr könnt gleichzeitig auf einen Tastendruck warten und Sachen ausführen, z.B. ein Quadrat über den Bildschirm laufen lassen und so weiter. Allerdings ist
kbhit() ziemlich langsam, und deshalb werden wir nun eine dritte Methode kennenlernen:
_rowread().
b)
_rowread bzw.
_keytest
Wir benutzen nun nicht direkt _rowread, sondern
_keytest, eine Funktion, die _rowread benutzt aber etwas einfacher ist.
Und schon wieder ein Programm! Diesmal soll es 'key4' heissen:
// C Source File
// Created 31.08.04; 15:48:32
#include
// Haupt-Funktion
void _main(void)
{
// Lösche Bildschirminhalt
clrscr();
// Schrifgröße auf 'mittel' stellen
FontSetSys(F_6x8);
// Wir sagen dem Benutzer, was er gedrückt hat, bis er [ESC] drückt
do {
if (_keytest(RR_LEFT)) {
// Der Benutzer hat 'links' gedrückt
printf("links\n");
GKeyFlush();
}
if (_keytest(RR_RIGHT)) {
// Der Benutzer hat 'rechts' gedrückt
printf("rechts\n");
GKeyFlush();
}
if (_keytest(RR_UP)) {
// Der Benutzer hat 'hoch' gedrückt
printf("hoch\n");
GKeyFlush();
}
if (_keytest(RR_DOWN)) {
// Der Benutzer hat 'runter' gedrückt
printf("runter\n");
GKeyFlush();
}
} while (!_keytest(RR_ESC));
}
OK, wie wir beim Testen sehen zeigt das Programm immer die Taste an, die wir drücken (sei sie denn eine Richtungstaste). Aber was macht denn
_keytest?? Es wird geprüft, ob wir eine Taste drücken, und zwar die, die als Parameter (in der TIGCC Doc stehen die vordefinierten Tasten drin) angegeben ist. Doch diesmal word nicht
KEY_ESC sondern
RR_ESC, wobei der Wert zwi Zahlen beschriebt: Die Reihe und Spalte der Taste [ESC]. Wenn ihr mehr hierzu wissen wollt, dann schaut in der TIGCC Documentation unter _rowread. Wird die Taste also gedrückt, wird '1' zurückgegeben, wenn nicht, dann '0'. Wieder kann von
if() direkt auf wahr oder falsch geprüft werden. Nach
printf() wird der Tastaturspeicher wieder geleert, da sonst Fehler auftreten könnnen. Welche? Probiert es aus! Alles dauert solange bis..
} while (!_keytest(RR_ESC));
..wir [ESC] drücken. Die do-Schleife unterscheidet sich nicht groß von der
while-Schleife, es führt etwas so lange aus, wie der von
while geprüfte Wert wahr ist. Also hier so lange, wie [ESC] nicht gedrückt wird.
Ihr seht, dass wir einer
if-Schleife nun mehrere Bedinggungen haben, also fassen wir sie mit zwei geschweiften Klammern ein. Das ganze gilt auch für die
do-while-Schleife.
c)
_keytest_optimized
Wir nehmen einfach das gleiche Beispiel wie zuvor, jedoch mit dem Befehl
_keytest_optimized. Nennt es einfach 'key5'.
// C Source File
// Created 31.08.04; 16:02:02
#include
// Haupt-Funktion
void _main(void)
{
// Lösche Bildschirminhalt
clrscr();
// Schrifgröße auf 'mittel' stellen
FontSetSys(F_6x8);
// Wir sagen dem Benutzer, was er gedrückt hat, bis er [ESC] drückt
do {
BEGIN_KEYTEST
if (_keytest_optimized(RR_LEFT)) {
// Der Benutzer hat 'links' gedrückt
printf("links\n");
GKeyFlush();
}
if (_keytest_optimized(RR_RIGHT)) {
// Der Benutzer hat 'rechts' gedrückt
printf("rechts\n");
GKeyFlush();
}
if (_keytest_optimized(RR_UP)) {
// Der Benutzer hat 'hoch' gedrückt
printf("hoch\n");
GKeyFlush();
}
if (_keytest_optimized(RR_DOWN)) {
// Der Benutzer hat 'runter' gedrückt
printf("runter\n");
GKeyFlush();
}
END_KEYTEST
} while (!_keytest(RR_ESC));
}
Eigentlich hat sich nicht viel verändert, allerdings ist das dazugekommen:
BEGIN_KEYTEST
....
END_KEYTEST
mit
_keytest_optimized() kann nur in dem von diesen zwei Befehlen beschriebenen Raum geprüft werden (für unsere
while()-Bedingung benutzen wir erneut
_keytest(). Allerdings hätten wir END_KEYTEST auch dahinter setzen können).
OK, so weit so gut, und nächstes Mal gibt's dann Variablen.