Uwaga: muszę sondować, a nie wywoływać oddzwanianie z powodu ograniczeń API (SFML). Przepraszam również za brak „przyzwoitego” tytułu.
Myślę, że mam tutaj dwa pytania; jak zarejestrować otrzymywane informacje i co z nimi zrobić.
Obsługa danych wejściowych
Mówię o tym po tym, jak zarejestrowałeś, że klawisz „A” został naciśnięty, na przykład, i jak to zrobić od tego momentu.
Widziałem tablicę całej klawiatury, coś w stylu:
bool keyboard[256]; //And each input loop check the state of every key on the keyboard
Ale to wydaje się nieefektywne. Nie tylko przykładasz klawisz „A” do „gracza poruszającego się w lewo”, ale sprawdza on każdy klawisz 30–60 razy na sekundę.
Następnie wypróbowałem inny system, który szukał tylko pożądanych kluczy.
std::map< unsigned char, Key> keyMap; //Key stores the keycode, and whether it's been pressed. Then, I declare a load of const unsigned char called 'Quit' or 'PlayerLeft'.
input->BindKey(Keys::PlayerLeft, KeyCode::A); //so now you can check if PlayerLeft, rather than if A.
Jednak problem polega na tym, że nie mogę teraz wpisać nazwy bez konieczności wiązania każdego klucza.
Następnie mam drugi problem, który nie jest w stanie wymyślić dobrego rozwiązania dla:
Wysyłanie danych wejściowych
Wiem teraz, że klawisz A został naciśnięty lub że playerLeft jest prawdziwy. Ale jak mam stąd wyjść?
Pomyślałem o sprawdzeniu
if(input->IsKeyDown(Key::PlayerLeft) { player.MoveLeft(); }
To bardzo łączy dane wejściowe z istotami i uważam, że jest to dość bałagan. Wolałbym, żeby gracz sam sobie poradził, gdy zostanie zaktualizowany. Myślałem, że jakiś system wydarzeń może działać, ale nie wiem, jak się z tym pogodzić. (Słyszałem, że sygnały i automaty były dobre do tego rodzaju pracy, ale najwyraźniej są bardzo powolne i nie widzę, jak by to pasowało).
Dzięki.