"Key" Array in der "main"-Funktion - Verzögerung einbauen



  • Hallo,

    Ich benutze die "Allegro" Bibliothek (http://alleg.sourceforge.net/) und brauche also kein Fenster etc. selbst erschaffen.

    Ich habe also auch nur die in der main enthaltenen Events zur Verfügung. Nun würde ich gerne auf Tastendruck reagieren und benutze dazu das "Key" Array.

    Soweit alles gut, aber: Wie sorgt man dafür, dass beim drücken einer Taste auf diese tatsächlich auch nur EINMAL reagiert wird? Momentan kommt der jeweilige Aufruf immer mehrmals, weil die Taste natürlich mehrere Millisekunden unten ist..

    danke!



  • Normalerweise machst du da was mit der Zeit, also, dass nur alle, sagen wir 0.5 Sekunden die Funktion aufgerufen werden darf

    if (time >= 0.5)
    {
      foo (..);
      time = 0.0
    }
    


  • versteh ich nicht deck...ich benutz auch allegro...erklär mal was willst du denn genau machen? kann dir sicher helfen. Gib einfach mal den teil der abfrage den du hast...bin gespannt

    edit: schau in 1 stunde nochmal hier rein



  • Hallo,

    Also ich hatte natürlich auch daran gedacht etwas mit time zu machen, habe mich nur gefragt ob es nicht eine schönere standard Lösung gibt. Aber danke für die Antworten.
    Ich will letztlich einfach nur in einer While Schleife in der main auf bestimmte Tasten reagieren.
    Hier der code um den es geht aus der main Funktion:

    while( !key[KEY_ESC]){
    
               if(!ShowOptions)
               {
                   if(key[KEY_SPACE])
                   {
                       Next();
                   }
                   if(key[KEY_ENTER])
                   {
                   }
               }
               if(key[KEY_F5])
               {
                   ShowOptions=!ShowOptions;
               }
    
               Paint();
        }
    


  • In deinem Fall solltest du dich mit Events befassen. Das Abfragen des Key-Arrays wie du es machst ist fuer andere Zwecke besser geeignet.
    Ich kenne mich mit Allegro nicht aus, aber laut Doku bietet es ein Event-System an.
    Das heisst du kannst dich bei einem Tastendruck einfach informieren lassen und musst nicht selbst immer danach fragen.
    Siehe auch hier hier. Interessant waere fuer dich wohl ALLEGRO_EVENT_KEY_DOWN bzw. ALLEGRO_EVENT_KEY_UP.

    Gruss,
    DeSoVoDaMu



  • ah ich glaub ich weiß, wo der hund bei dir begraben liegt. dir fehlt nehm ich an ein keypressed().

    So z.B. war der Code teil von der Abfrage von einem Spiel von mir:

    while(keypressed())
    		{
    			int k=readkey() >> 8;
    
    				if(key[KEY_ENTER])
    				{
    					zustand=1;
    				}
    
    				if((key[KEY_UP]))
    				{
    					cout << "up";
    					playerdata[0].strength+=10;
    					textfelderleeren(zustand);
    
    				}
    
    				if((key[KEY_DOWN]))
    				{	
    					cout << "down";
    					playerdata[0].strength-=10;
    					textfelderleeren(zustand);
    				}
    
    				if((key[KEY_LEFT]))
    				{
    					cout << "left";
    					playerdata[0].angle-=5;
    					textfelderleeren(zustand);
    				}
    
    				if((key[KEY_RIGHT]))
    				{	
    					cout << "right";
    					playerdata[0].angle+=5;
    					textfelderleeren(zustand);
    
    				}
    		}
    


  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Du meine Güte das war wirklich nicht einfach zu lösen!

    Danke für die Vorschläge, aber sie haben alle nicht funktioniert.
    Denn: Die events sind nur in Planung für Allegro 5 und noch nicht implementiert und das while(keypressed()) hat nichts gebracht - es ist ja auch nur eine Abfrage ob ne Taste unten ist und das ist sie ja.

    Die Lösung ist letztlich die:

    Zuerst Keyboard refresh Rate verlangsamen:

    set_keyboard_rate(2000,2000);
    

    Das alleine bringt aber nichts - man muss erst das key array manuell wieder zurücksetzen, sonst dauert es einige Zeit bis Allegro das macht und so lange kommt immer wieder der Aufruf. Deshalb:

    if(key[KEY_SPACE])
    {
        "Aufruf";
        key[KEY_SPACE]=false;
    }
    

Anmelden zum Antworten