Примечание: я должен опрашивать, а не делать обратные вызовы из-за ограничений API (SFML). Я также извиняюсь за отсутствие «приличного» названия.
Я думаю, у меня есть два вопроса здесь; как зарегистрировать вход, который я получаю, и что с ним делать.
Обработка ввода
Я говорю после того, как вы зарегистрировали тот факт, что, например, была нажата клавиша «А», и как это сделать.
Я видел массив всей клавиатуры, что-то вроде:
bool keyboard[256]; //And each input loop check the state of every key on the keyboard
Но это кажется неэффективным. Например, вы не только связываете клавишу «А» с «игроком, двигающимся влево», но и проверяет каждую клавишу 30–60 раз в секунду.
Затем я попробовал другую систему, которая просто искала нужные ключи.
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.
Однако проблема в том, что теперь я не могу ввести имя, например, без необходимости связывать каждый ключ.
Затем у меня есть вторая проблема, которую я не могу придумать для хорошего решения:
Отправка ввода
Теперь я знаю, что была нажата клавиша A или что playerLeft - это правда. Но как мне идти отсюда?
Я думал о простой проверке.
if(input->IsKeyDown(Key::PlayerLeft) { player.MoveLeft(); }
Это сильно связывает ввод с сущностями, и я нахожу это довольно грязным. Я бы предпочел, чтобы игрок обрабатывал свое собственное движение, когда оно обновляется. Я думал, что какая-то система событий могла бы работать, но я не знаю, как с этим справиться. (Я слышал, что сигналы и слоты были хороши для такой работы, но, по-видимому, они очень медленные, и я не вижу, как они подходят).
Благодарю.