GetAsyncKeyState() Problem



  • Hallo

    ich hab ein Problem mit GetAsyncKeyState() ich hab damit ein Menü versehen

    do{
    
    	cout << "\n\n\n\n\n\n\n\t\t\t Menu\n\n";
    	cout << "\t\t\t Spiel starten               <1>\n\n";
    	cout << "\t\t\t Letzten Highscore ansehen   <2>\n\n";
    	cout << "\t\t\t Beenden                     <3>\n\n";
    	cout << "\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t© by Dreatmaster";
    	//Läuft solange bis eine Taste gedrückt wird --> verhindert das flackern
    	while(gedruckt == false)
    	{
    		if(GetAsyncKeyState(0x32))
    		{
    			system("cls");	
    			highscore();
    			gedruckt = true;
    		}  
    
    		else if(GetAsyncKeyState(0x31))
    		{
    			system("cls");
    			game();
    			gedruckt = true;
    		}
    
    		else if(GetAsyncKeyState(0x33))
    		{	
    			system("cls");
    			cout << "\n\n\n\n\n\n\n\n\n\t\t\t    Spiel wird beendet.\n\t\t\t    Bis zum naechsten mal.";
    			bClose = true;
    			gedruckt = true;
    		}
    	}//Taste wurde gedrückt und die Schleife wird beendet
    	gedruckt = false;
    //Spiel beenden wurde angewählt --> Fenster wird geschlossen
    }while(bClose == false);
    

    das so aussieht, wenn man jetzt das Spiel startet kommt die Eingabe der Spielernamen nur muss man dazu die 1 drücken und diese steht dann schon in der Konsole und auch alles andere was man vorher gedrückt hatte.
    Weiß jemand wie man das ändern könnte?



  • Jup ...

    schreib es so:

    if (GetKeyState(VK_CONTROL)& 0x8000)
    

    das '& 0x8000' bewirkt das die Taste wieder aus dem Speicher gelöscht wird, oder sowas. Man kann es glaube ich auch so schreiben:

    if (GetKeyState(VK_CONTROL)>0)
    

    Wenn es mit '...Async...' nicht geht nutz halt GetKeyState. Den Unterschied kenn ich noch nicht, aber ich benutze momentan letzteres.

    Wenn ich dich richtig verstanden habe.


  • Mod

    & 0x8000 bewirkt kein Löschen, sondern es ist die boolsche Operatin eine AND. D.h. es werden nur die bits übernommen, die in beiden Masken auf 1 stehen. Da das höchste Bit bei GetAsnchKeyState auf 1 ist, wenn die Taste gedrückt ist, ist diese Prüfung also nichts anderes als logisch.
    Sie liefert nur !=0 (also true), wenn die Taste gedrückt ist.

    GetKeyState macht nur dnan sinn, wenn auch Nachrichten berabeietet werden. GetAsnchKeyState wie hier zu verwenden macht in meinen Augen keinerlei Sinn.



  • Martin Richter schrieb:

    & 0x8000 bewirkt kein Löschen, sondern es ist die boolsche Operatin eine AND. D.h. es werden nur die bits übernommen, die in beiden Masken auf 1 stehen. Da das höchste Bit bei GetAsnchKeyState auf 1 ist, wenn die Taste gedrückt ist, ist diese Prüfung also nichts anderes als logisch.
    Sie liefert nur !=0 (also true), wenn die Taste gedrückt ist.

    GetKeyState macht nur dnan sinn, wenn auch Nachrichten berabeietet werden. GetAsnchKeyState wie hier zu verwenden macht in meinen Augen keinerlei Sinn.

    Ich bin hier drauf gestoßen: http://www.gidforums.com/t-3221.html
    Ist Hilfreich zum Verstehen der Sache.

    Bis jetzt habe ich verstanden, dass das High-Bit "in GetKeyState" angibt ob die Taste gedrückt ist.
    Wenn GetKeyState('E') ein True liefert, wenn ich die E-Taste drücke - was dann wohl nur die Änderung des höchsten Bits [Des höchsten von WAS denn genau?] auf eine 1 wäre - und wenn danach das höchste Bit nochmal auf True gesetzt wird, also eine Addition in Binär, würde das dann Bedeuten das dieses eben wieder auf False steht und wenn ein noch höheres gäbe, würde dieses eben nun auf 1 stehen.

    Richtig? Aber warum der logische Operator AND?
    Ist das eine Anweisung für die IF-Anweisung, das was danach kommt zu tun, bevor es in die ihr untergeordneten Codeblöcke weiter gibt? Also eine Anweisung irgendwas zu verändern, ohne das diese Veränderung etwas mit dem True-False-Abgleich der IF-Anweisung zu tun hat?
    Könnte ich so auch, wie in einer FOR-Schleife, Variablen inkrementieren oder beschränkt sich das auf Bit-Operation der vorangegangenen Abgleiche?

    So klingt das für mich logisch. Dein Beitrag war zwar im Grunde hilfreich, beinhaltet aber zu weing Information. 😃
    Trotzdem danke!

    MfG



  • Ich würd gern wissen ob das richtig ist. 😃
    Danke,
    mfG


Log in to reply