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ę.
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).
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
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).