Nota: Preciso pesquisar, em vez de fazer retornos de chamada devido às limitações da API (SFML). Também peço desculpas pela falta de um título "decente".
Eu acho que tenho duas perguntas aqui; como registrar a entrada que estou recebendo e o que fazer com ela.
Manipulação de entrada
Estou falando após o fato de você ter registrado que a tecla 'A' foi pressionada, por exemplo, e como fazê-lo a partir daí.
Eu já vi uma variedade de todo o teclado, algo como:
bool keyboard[256]; //And each input loop check the state of every key on the keyboard
Mas isso parece ineficiente. Você não apenas está acoplando a tecla 'A' ao 'jogador que se move para a esquerda', por exemplo, mas também verifica todas as teclas, 30 a 60 vezes por segundo.
Então tentei outro sistema que apenas procurava as chaves que queria.
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.
No entanto, o problema é que agora não posso digitar um nome, por exemplo, sem precisar vincular todas as chaves.
Então, eu tenho o segundo problema, pelo qual não consigo realmente pensar em uma boa solução para:
Entrada de envio
Agora eu sei que a tecla A foi pressionada ou que playerLeft é verdadeiro. Mas como eu vou daqui?
Pensei em apenas checar
if(input->IsKeyDown(Key::PlayerLeft) { player.MoveLeft(); }
Isto acopla muito a entrada às entidades, e acho isso bastante confuso. Prefiro que o jogador lide com seu próprio movimento quando for atualizado. Eu pensei que algum tipo de sistema de eventos poderia funcionar, mas não sei como fazê-lo. (Ouvi sinais e slots eram bons para esse tipo de trabalho, mas aparentemente é muito lento e não consigo ver como se encaixaria).
Obrigado.