Hinweis: Ich muss aufgrund von API-Einschränkungen (SFML) abfragen, anstatt Rückrufe auszuführen. Ich entschuldige mich auch für das Fehlen eines "anständigen" Titels.
Ich glaube, ich habe hier zwei Fragen. Wie registriere ich den Eingang, den ich erhalte, und was mache ich damit?
Umgang mit Eingaben
Ich spreche davon, nachdem Sie registriert haben, dass zum Beispiel die A-Taste gedrückt wurde, und wie es von dort aus gemacht wird.
Ich habe ein Array der gesamten Tastatur gesehen, so etwas wie:
bool keyboard[256]; //And each input loop check the state of every key on the keyboard
Dies scheint jedoch ineffizient. Sie koppeln nicht nur die Taste 'A' mit 'Spieler bewegt sich nach links', sondern überprüfen jede Taste 30-60 Mal pro Sekunde.
Ich habe dann ein anderes System ausprobiert, das nur nach Schlüsseln suchte, die es wollte.
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.
Das Problem dabei ist jedoch, dass ich jetzt keinen Namen eingeben kann, ohne jeden einzelnen Schlüssel binden zu müssen.
Dann habe ich das zweite Problem, für das ich mir keine gute Lösung vorstellen kann:
Senden von Eingaben
Ich weiß jetzt, dass die A-Taste gedrückt wurde oder dass playerLeft wahr ist. Aber wie gehe ich von hier aus?
Ich habe darüber nachgedacht, nur zu prüfen.
if(input->IsKeyDown(Key::PlayerLeft) { player.MoveLeft(); }
Dadurch werden die Eingaben in hohem Maße mit den Entitäten verknüpft, und ich finde es ziemlich chaotisch. Ich würde es vorziehen, wenn der Spieler seine eigene Bewegung ausführt, wenn er aktualisiert wird. Ich dachte, eine Art Ereignissystem könnte funktionieren, aber ich weiß nicht, wie ich damit umgehen soll. (Ich habe gehört, dass Signale und Slots für diese Art von Arbeit gut sind, aber es ist anscheinend sehr langsam und ich kann nicht sehen, wie es passen würde).
Vielen Dank.