Abfrage eines Zeichens aus dem Konsoleninput ohne kurze Pause nach ersten Zeichen



  • The Key schrieb:

    Gibt es da nicht noch eine andere Möglichkeit, den Tasteninput des Users in der Konsole abzufragen, ohne dass ich erst die Zeichenwiederholungsverzögerung auf 0 setze?

    Jetzt geht's Dir aber plötzlich um ganz was anderes, vorher war nur von der Verzögerung die Rede! Ich verstehe Dein Anliegen trotzdem noch nicht richtig. Zeichen kannst Du mit std::cin, oder ohne Echo, und Zeichenweise mit getch() ausgeben. Aber wo genau liegt das Problem? Kannst Du Dich etwas genauer ausdrücken?



  • Kannst du Dir da nicht vorstellen, welche Art von Funktionalität ich implementieren möchte?

    Ich erkläre es mal an einem kleinem Beispiel:

    Ein Quasi-Jump'n'Run:

    Ein Männchen auf einer Linie.
    Wenn der User zum Beispiel die Pfeiltaste rechts drückt, dann soll das Männchen sich natürlich ohne diese verzögerung nach rechts bewegen.

    Das ist die ganze Geschichte.

    Das da natürlich noch mehr Probleme, wie gleizeitiges Drücken zweier Tasten auftritt, wenn ich _getch() verwende, ist klar.
    Aber ich habe mein Augenmerk erst einmal auf diese Verzögerung gelegt.



  • du brauchst bei einen jamp ´n´run mit gegner und auch ohne eine verzögerung!!!
    sonst ist dein mänchen in einem bruchteil von einer sekunde degen was gerand ohne das du drüber springen kann dafür eigenet sich unter windows Sleep() aus der windows.h oder du kannst dir auch eine eigene funktion bauen

    void mywait (int);
    
    void mywait(int d)
    {
     struct time t, tneu;
     int loop;
    
     for (loop=0; loop<d; loop++)
       {
       gettime(&t);
       gettime(&tneu);
       while (t.ti_hund == tneu.ti_hund) gettime(&tneu);
       }
     }
    

    die funktion stammt nicht von mir hat jemand anderst geschrieben

    für die eingabe ist getch() geeigned sowie vll kbhit()
    mit diesem wissen müstest du die funktion schon hinbekommen 😉



  • The Key schrieb:

    Wenn der User zum Beispiel die Pfeiltaste rechts drückt, dann soll das Männchen sich natürlich ohne diese verzögerung nach rechts bewegen.

    Da bleibt Dir aber leider nichts anderes übrig, als tatsächlich die systemweite Variable für die Tastenverzögerung umzustellen. Das muss dann aber nicht zwangsläufig bedeuten, dass es sich auf das gesamte System ausweitet. Mit einer einfachen Abfrage, ob das Konsolenfenster gerade aktiv ist, kannst Du verhindern, dass die Tastenverzögerung auch ausserhalb Deines Programmes greift. Sobald also das Fenster in den Hintergrund gerät, einfach wieder auf Default-Verzögerung umstellen.

    Kurzes Beispiel:

    if(::GetActiveWindow() == ::FindWindow(NULL, "ConsoleWindowClass"))
    {
            // Konsolenfenster im Vordergrund, also aktiviert, systemweite Tastenverzögerung
            // kann herab gesetzt werden.
    }
    

    Ich hoffe, das hilft Dir weiter.



  • ich würde eh für den anfang von den pfeiltasten abraten eher "awsd" da die pfeiltasten kein ASCII/ANSI-Code zugewiesen ist
    und ich selbst hab keie richtige oder sichtbare verzögerung in einem von mir selbstgeschriebenen snake die schlange bewegt sich nach rechts wenn ich d drück und das in meinen augen sofort und nicht entscheidend ok ich überprüf nicht immer ob die taste gedrückt ist ich überprüf ob einen andere gedrückt wurde aber in deinem fall kannst du prüfen ob die taste noch gedrückt ist
    kann auch sein das ich dein problem nicht richtig versteh



  • okay. Das ist verstanden.

    Und hast du auch eine Lösung für mein zweites Problem? Zwei oder mehrere Tasten gleichzeitig zu überprüfen auf 'Gedrückt' oder 'Nicht Gedrückt' oder ist das bei Konsolenanwendungen nicht möglich?



  • GAMES schrieb:

    ich würde eh für den anfang von den pfeiltasten abraten eher "awsd" da die pfeiltasten kein ASCII/ANSI-Code zugewiesen ist

    Aber das ist doch kein Grund, gleich von den Pfeiltasten abzuraten. Beim Drücken der Pfeiltasten (u.A.) wird ein entsprechender, standarisierter Sondercode zurück gegeben, auf den man dann entsprechend reagieren kann. Wo liegt dann also das Problem? 🙂



  • @GAMES:
    Ja, stimmt schon.
    Aber bei meinen SNAKE gings auch mit Pfeiltasten und auch wie du sagtest reagiert die Schlange sofort.
    Das ist aber nicht das Problem. Mein Problem ist, dass nach dem Gedrückthalten einer Taste 'x' eine Pause nach der Ausgabe des ersten Zeichens 'x' passiert. Und erst nach dieser Pause kommen die Zeichen 'x' ohne Unterbrechung, und ich weiß, dass der User diese taste ununterbrochen drückt.
    mikey nannte es Zeichenwiederholungsverzögerung.

    Aber danke für die Anmerkung



  • The Key schrieb:

    Und hast du auch eine Lösung für mein zweites Problem? Zwei oder mehrere Tasten gleichzeitig zu überprüfen auf 'Gedrückt' oder 'Nicht Gedrückt'

    Da fällt mir grad' spontan nur GetAsyncKeyState() aus der Win API ein... sonst fällt mir auch keine bessere Lösung ein. Einfach mal auf der MSDN gucken. Diese Referenz kann dir manchmal auch ganz gut weiter helfen:
    http://msdn2.microsoft.com/en-us/library/ms682073(VS.85).aspx

    Soviel kann ich aber schonmal sagen, dass es keine Standard C++ Lösung dafür gibt... Entweder, du bastelst dir etwas mit _getch und _kbhit zusammen (denke ich, klappt so nicht), oder du weichst auf die wesentlich unsaubere Methode mit der API aus. Oder du schreibst dir gleich einen eigenen Keyboard-Hook. 😃



  • mikey du kannst mir warscheinlich auch sagen wie ich peiltasten ohne pfusch richtig auslesse vll sogar mit kleinem bsp cod



  • Danke. Das hat mir schon sehr geholfen. Ist zwar noch nicht ganz perfekt, aber nah dran.

    @GAMES:

    intkey = 0;
    do
    {
        if(_kbhit())
        {
            key = _getch();
    
            if(key == 'A')
            {
                // shift + 'A' is pressed
            }
            else if(key == 'a')
            {
                // 'A' is pressed
            }
            else if(key == 224)
            {
                key == _getch();
    
                if(key == 75)
                {
                    // key left is pressed down
                }
                else if(key == 77)
                {
                    // key right is pressed down
                }
            }
        }
    }
    while(key != 13);
    

    So sieht das bei mir immer aus.



  • hab ne gepfuschte version die wird jetzt überarbeidet ich frag mich wie die eig laufen kann fraglich aber jetzt wirds verbessert
    zu deinem problem mit dem gleichzeitig glaub wenn du 2 tasten drückst werden die nacheinander eingegeben vll kannst ja deine eingaben in einem array speichern und die dann auswerten auf diese weiße würd ich versuchen das problem zu lösen
    ein array der genau oder max 2 eingaben speichert und diese nach der auswertung\weiterverarbeitung löscht
    ich denk mal dein mänchen soll nur vor zurück springen und vll sich ducken können



  • Ich kann das Problem von The Key problemlos nachvllziehen. Habe aus dem gleichen Grund "nur" ein Snake programmiert da man da ja nicht die taste gedrückt halten muss.anscheinend liegts an kbhit(); das funktuniert nicht so wies sollte^^



  • GAMES schrieb:

    mikey du kannst mir warscheinlich auch sagen wie ich peiltasten ohne pfusch richtig auslesse vll sogar mit kleinem bsp cod

    Aber immer gerne doch:

    eing = getch ();
    switch(eing)
    {
        case 72: /* Nach oben-Taste   */   break;
        case 80: /* Nach unten Taste  */   break;
        case 75: /* Nach links-Taste  */   break;
        case 77: /* Nach rechts-Taste */   break;
        default:break;
    }
    

    Dede1989 schrieb:

    anscheinend liegts an kbhit(); das funktuniert nicht so wies sollte

    Nene, das funktioniert schon so, wie es funktionieren soll. Es liegt nur am Anwender 😉



  • Gut ich habe diese WinAPI-Funktionen getestet. Sie machen fast alle was sie sollen.

    Was ich jetzt doch noch wissen will:
    1. Was wäre denn an Standard besser, weil du etwas von 'unsauber' sagtest.
    2. GetKeyboardState liefert nicht keine vernünftigen Werte. GetAsyncKeyState tut zwar auch seine Schuldigkeit, aber mir würde es doch gefallen, alle Werte auf einmal zu erhalten.



  • The Key schrieb:

    1. Was wäre denn an Standard besser, weil du etwas von 'unsauber' sagtest.

    Eine Standard C++ Lösung ist deshalb immer besser, weil der daraus resultierende Code portabel ist, also auf allen Platformen läuft. Lösungen, die z.B. mit getch() und anderen Funktionen aus diversen non-Standard Headern arbeiten, müssen sich nicht zwangsläufig unter jedem Compiler kompilieren lassen, da es nicht vorgeschrieben wird, ob diese mitgeliefert werden müssen, oder nicht.

    The Key schrieb:

    2. GetKeyboardState liefert nicht keine vernünftigen Werte. GetAsyncKeyState tut zwar auch seine Schuldigkeit, aber mir würde es doch gefallen, alle Werte auf einmal zu erhalten.

    Da gibt es afaik keine fertige Lösung, die wirst du dir selbst in eine Funktion packen müssen.



  • beim einlessen der pfeiltasten ist die lösung von The Key besser als die von dir mikey da er überprüft ob es wirklich eine Pfeiltaste ist bei dir kommt dein programm mit den Pfeiltasten und PMKH glaub ich durcheinander (haben beide bei dir den gleichen zahlen wert) 😉
    und an The Key ich würd mir eine funktion basteln die genau das kann was du willst
    amein ansatz wäre der array denn ich oben genannt habe



  • Achso, das mit den Verwechslungen der anderen Tasten hatte ich garnicht berücksichtigt. Da ist die Lösung von 'The Key' natürlich wesentlich besser 😉



  • keiner ist perfekt^^
    ich nicht du nicht keiner 😉
    weil ich hatte eine ähnliche lösung wie du
    deswgen war die frage auch ohne pfusch 😉
    ich glaub wenn du anstatt de 224 die 0 nimmst kannst auch die pfeiltasten vom nummernblock rauslessen



  • Haben wir doch alle wieder was gelernt. 😉

    Das mit der Funktion basteln würd ich ja gerne machen oder auch das ganze in eine Klasse kapseln, aber wenn der Standard es nicht hergibt (wo ich eigentlich sagen muss, dass er dann den Namen Standard nicht verdient), dann müssen halt erstmal andere Funktionen her.

    mein ansatz wäre der array denn ich oben genannt habe

    Die Idee ist gut. Und mit der WinAPI-Funktion GetKeyboardState wäre das Problem eigentlich gelöst, aber genau diese Funktion geht nicht bzw. sie füllt das Array nicht ordentlich aus.


Anmelden zum Antworten