Pfeiltastendruck (ASCII-code) erkennung





  • DasC schrieb:

    Gleich kommt der SeppJ und heult wegen deinem Deutsch, pass auf.

    Maul.

    Die Pfeiltasten (Cursor-Tasten) sowie die anderen Funktionstasten liefern zwei Zeichencodes.

    In der WinAPI vielleicht.
    Und wo wir schon dabei sind, diese Funktion duerfte es tun:

    bool pressed(int code)
    {
        return GetKeyState( code ) >> ( sizeof ( GetKeyState(0) ) * 8 - 1);
    }
    

    Die Pfeiltastencodes sind

    *VK_LEFT
    VK_RIGHT
    VK_UP
    VK_DOWN
    *

    Bedeutung duerfte vom Kontext her erkenntlich sein. 😃
    Vergiss nicht, dass das bei jedem Pruefen durch diese Funktion der Status abgefragt wird, wenn eine Taste also gedrueckt ist, wird diese Funktion bei entsprechendem Parameter solange true zurueck geben, bis die Taste wieder losgelassen wird. Also nicht, dass deine Schlange in Lichtgeschwindigkeit nach links fliegt, wenn du das drueckst 😉

    durch das drücken der pfeiltaste soll eine aktion ausgeführt werden,

    Wirklich? Oder einfach nur aus Spass abfragen? 😉



  • Vielen Dank 7xCore, es hat geklappt 😉
    An Sone: dieser c++ code bringt mir leider überhaupt nichts 😞 ,
    aber trotzdem danke.

    EDIT:
    so nebenbei:
    das wird kein snake spiel, sondern ein einarmiger bandit
    (snake wäre ja auch wirklich zu klassisch 😉 )

    MFG
    uncannysnake



  • uncannysnake schrieb:

    An Sone: dieser c++ code bringt mir leider überhaupt nichts 😞

    Verstehst du nicht, wie du ihn anwenden sollst/wie er funktioniert? Eine einfachere Version ist die:

    bool pressed(int code)
    {
        return GetKeyState( code ) >> 15;
    }
    


  • #include <stdio.h>
    #include <conio.h>
    
    typedef void  (*pFunc) (void);
    
    unsigned char read_key ( void )
    {
    	int c = _getch();
    	if ( c == 0 || c == 224 )
    		return _getch();
    	return c;
    }
    
    void f1 (void ) // 0, 59
    {
    	puts("F1");
    }
    
    void f2 (void ) // 0, 60
    {
    	puts("F2");
    }
    
    void up (void ) // 224, 72
    {
    	puts("up");
    }
    
    void right (void) // 224, 77
    {
    	puts("right");
    }
    
    void down (void)	// 224, 80
    {
    	puts("down");
    }
    
    void left ( void ) // 224, 75
    {
    	puts("left");
    }
    
    void not_implemented_yet (void)
    {
    	puts("Not implemented yet.");
    }
    
    void bye(void)
    {
    	puts("Thanks for trying, bye!");
    }
    
    int main(void)
    {
    	int index;
    	pFunc pfarr[256];
    
    	for (index=0; index<256; index++)
    		pfarr[index]=not_implemented_yet;
    
    	pfarr[59] = f1;
    	pfarr[60] = f2;
    	pfarr[72] = up;
    	pfarr[77] = right;
    	pfarr[80] = down;
    	pfarr[75] = left;
    	pfarr[0] = not_implemented_yet;
    	pfarr[27] = bye;
    
    	puts("Welcome to BB's arrow keys function pointer example!" );
    	puts("Press Esc to quit." );
    
    	while(27 != index)
    		pfarr [index=read_key()]();
    
    	return 0;
    }
    


  • #include <windows>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    while(1)
    {
    Sleep(1); // Damit die CPU nicht so viel arbeiten muss
    // Bei alten PC führt der Code sonst zu 100% CPU Auslastung
       if ( GetAsyncKeystate(65) == -32767 )
       {
           cout<<"you have press a "<<endl;
       }
    }
    
    }
    

    Wenn die Taste a ( 65 )gedrückt wurde dann gibt GetAsyncKeyState den Wert -32767 zurük.

    google Suchbegriff: msdn GetAsyncKeyState
    Da findest du mehr Infos zu der Funktion.

    cpp]
    #include <windows>
    #include <conio> // getch(); ist aus der C-Library
    #include <iostream>
    using namespace std;

    int main()
    {
    int key;
    while(1)
    {
    key = getch();
    if ( key == 65) // Bin mir nicht sicher ob getch(); hier 65 zurückgibt.
    // Hab auch gerade kb das zu testen.^^
    {
    cout<<"you have press a "<<endl;
    }
    }

    }
    [/cpp]



  • Getch() verhält sich bei Pfeiltasten anders: Es gibt einmal 224 zurück, und dann beim nächsten Aufruf den jeweiligen Code der Pfeiltaste, also als ob 2 Tasten hintereinander gedrückt wurden. Ignorieren darf man den Code 224 nicht, weil der Code jeder Pfeiltaste mit dem einer anderen Taste übereinstimmt und man nur über die 224 zwischen Pfeiltaste und anderer Taste unterscheiden kann.



  • DasC schrieb:

    Gleich kommt der SeppJ und heult wegen deinem Deutsch, pass auf.

    Wegen deines[i] Deutsch(s).



  • Wäre auch hier zu finden gewesen: http://www.c-plusplus.net/forum/39324 (FAQ-Eintrag)

    MfG SideWinder



  • Die meisten Input-Funktionen geben beim ersten Aufruf eine 0 zurück und leiten damit eine Sondertaste ein (Achtung: Der "Microsoft Visual C++"-Compiler macht dabei eine Ausnahme und liefert 0xE0 zurück - es sollte auf beides geprüft werden).

    mein microsoft visual c++ compiler (2010 :D) benutzt beide werte also, 0 und 0xE0.