Tworzę prostą grę, a jednym z problemów, z którymi się spotkałem, jest irytujące opóźnienie przy ciągłym naciskaniu klawisza.
Tak więc w zasadzie, kiedy naciskam (przez bardzo długi czas), na przykład Up, mój obiekt przesuwa się o 1 jednostkę w górę, nie porusza się (przez około 1 sekundę), a następnie porusza się ciągle o 1 jednostkę w górę (bez żadnych opóźnień).
Obecnie używam tego do przenoszenia obiektu (SDL2):
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_KEYDOWN:
switch (event.key.keysym.sym)
{
case SDLK_UP:
//Move object 1 unit up
break;
//Other unrelated things omitted
}
break;
//Omitted other cases
}
}
Chciałbym usunąć opóźnienie, aby obiekt mógł natychmiast Upbardzo szybko się poruszać . Czy jest na to sposób?
while key UP is down move 30 units per second
- i na sekundę ma sens tylko wtedy, gdy masz mierzalny czas między kluczem w dół i w górę - zwykle więcej niż jedną klatkę.Alternatywnym sposobem (podejście Josha również jest świetne!) Byłoby ustawienie wartości logicznej
SDL_KEYDOWN
i ewentualnie ignorowanie wszystkich powtarzających się kluczowych zdarzeń. Można to zrobić, sprawdzającrepeat
członka zdarzenia kluczowego.Następnie możesz wdrożyć swój własny zegar, który nie musi być niczym wymyślnym, i wprowadzić w życie powtarzanie klawiszy. Możesz albo uruchomić akcję bezpośrednio z timera, a nawet wygenerować
SDL_KEYDOWN
zdarzenie i ujednolicić rozwiązania.źródło