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.