Lepsza funkcja odczytująca co user wcisnął na klawiaturze

0

Witam,
piszę grę w openGL przy pomocy GLUT'a.
do tej pory wystarczało mi użycie glutKeyboardFunc do odczytania wciśniętych klawiszy na klawiaturze.
Niestety ta funkcja ma wady:
-po wcisnieciu klawisza jest ~1s przerwa między pierwszym a kolejnymi wykonaniami funkcji (czyli jeżeli przytrzymamy klawisz, reakcja odbędzie się po ok. 1 sekundzie)
-gdy wciśniemy kilka klawiszy na raz, odczytanie zostanie tylko jeden
Czy jest jakaś alternatywa mogąca zredukować te błędy?
Z góry dziękuję.

0

Wydaje mi się, że możesz mieć coś nie tak z główną pętlą gry (dotyczy tych przerw między naciśnięciem klawisza a efektem). A problem wielu klawiszy możesz rozwiązać zapisując w funkcji stany klawiszy do tablicy i w głównej pętli dopiero podejmować akcję (oczywiście czyszcząc pozycje w tablicy przy glutKeyboardUpFunc).

0

To jednak nie mój błąd lecz ta funkcja po prostu ma zakodowane, aby czekała sekundę po naciśnięciu klawisza :/
Jeżeli ktoś będzie miał ten problem oto rozwiązanie (stworzone przeze mnie):
Wiem, funkcja nie jest jakoś rozbudowana, lecz działa jak najbardziej poprawnie:

char keyStates[3] = {' ', ' ', ' '};

bool sprawdz_przycisk(unsigned char key123, int offon){
     //dodaj przycisk do tablicy = 1
     //usun przycisk z tablicy= 0
     //sprawdz czy w tablicy jest ten przycisk = 2
    if(offon == 2){
        for(int aq=0; aq<3; aq++){
            if(keyStates[aq] == key123){
                return true;
            }
        }
    }
    else if(offon == 1){
        for(int aq2=0; aq2<3; aq2++){
            if(keyStates[aq2] == key123){
                return false;
            }
            if(keyStates[aq2] == ' '){
                keyStates[aq2] = key123;
                return true;
            }
        }
    }
    else if(offon == 0){
        for(int aq3=0; aq3<3; aq3++){
            if(keyStates[aq3] == key123){
                keyStates[aq3] = ' ';
                return true;
            }
        }
    }
    return false;
} 

Jak już mówiłem, jest to bardzo prymitywna funkcja.
Teraz jak tego użyć:
gdy user wcisnął przycisk (dla przykładu W na klawiaturze):

 sprawdz_przycisk('w' , 1); 

gdy user puścił przycisk:

 sprawdz_przycisk('w' , 0);  

natomiast gdy chcemy sprawdzić czy przycisk jest wciśnięty:

 sprawdz_przycisk('w' , 2);   

Mój kod działa tylko do trzech przycisków na raz bo więcej chyba nie potrzeba. Jeżeli ktoś by chciał obsługiwać ich więcej, pozamieniajcie po prostu liczby w pętlach.

Ma nadzieję że komuś się przyda ^^
Pozdrawiam.

EDIT: Ahh. Zapomniałem o jednym: tą funkcję wykonujemy w pętli głównej gry (żeby wykonywała się co klatkę) inaczej nie będzie działać :P

0

Mój kod działa tylko do trzech przycisków na raz bo więcej chyba nie potrzeba. Jeżeli ktoś by chciał obsługiwać ich więcej, pozamieniajcie po prostu liczby w pętlach.

Więcej klawiszy na raz i tak większość klawiatur fizycznie nie obsłuży, a wiele ma problem z niektórymi kombinacjami już trzech.

Nie przeskoczysz, klawiatura która by widziała 100 klawiszy na raz musiałaby być znacznie bardziej skomplikowana elektrycznie (czytaj: bardzo droga).

1 użytkowników online, w tym zalogowanych: 0, gości: 1