W swoim silniku (napisanym w C++) do obsługi sterowania (przyciski klawiatury, kontrolera, myszy) używam windowsowych komunikatów przechwytywanych przez WndProc
pokroju WM_KEYDOWN
czy WM_KEYUP
. Odpowiednie kody przycisków (wraz z informacją o tym, czy przycisk jest wciśnięty czy nie), są zapisywane do kolejki. Kolejka natomiast jest synchronizowana z tablicą przycisków na początku każdej klatki. Dzięki temu z poziomu logiki gry można się odwoływać do tej tablicy, np. żeby sprawdzić sobie stan odpowiedniej flagi danego klawisza Controls[Key::SPACE].Pressed
(tak działa to obecnie).
Zastanawia mnie jednak, czy tak właśnie powinna wyglądać kwestia synchronizacji i oczyszczania kolejki. Załóżmy np., że mam grę typu FPS. Gracz nacisnął guzik odpowiedzialny za przeładowanie, więc rozpoczęła się animacja przeładowania broni. Zanim jednak animacja dobiegła końca, gracz nacisnął kolejny klawisz, odpowiedzialny za strzał. Oczywiście ta akcja nie mogła nastąpić w czasie przeładowania, więc input musiał w danym momencie (w danej klatce) zostać zignorowany. Tylko co z nim teraz zrobić? Zablokować przetwarzanie kolejki aż pojawi się możliwość obsługi tego klawisza (to raczej odpada, bo gracz powinien nadal móc np. się poruszać w czasie przeładowania)? Przerzucić ten klawisz na koniec kolejki i przetwarzać dalej pozostałe inputy, a potem do niego wrócić i sprawdzić, czy już można? A jeżeli miałbym przerzucić, to ile takich opóźnionych klawiszy powinno zostać zapisanych do wykonania "na potem"? Bo co będzie, jak np. w czasie tego przeładowania gracz naciśnie 10 innych klawiszy, odpowiedzialnych za 10 innych, chwilowo zablokowanych akcji (np. skok, kucnięcie, otwarcie ekwipunku itd.)? Czy wszystkie powinny zostać wykonane z opóźnieniem, zgodnie z kolejnością naciskania? A może powinien tu obowiązywać jakiś limit (np. do 3 ostatnio wykonanych akcji, które trafiają do bufora, a te starsze przepadają)? Nie pytam o konkretny kod (stąd temat w tym dziale), tylko raczej o koncepcję, ogólny zarys jak to powinno działać, żeby było responsywnie i wygodnie.
Swoje pytanie kieruję głównie do osób, które mają jakieś praktyczne doświadczenie w projektowaniu tego typu algorytmów.