Diese Probleme mit Tastenabfragen kommen vermutlich in so gut wie jedem Spiel auf. Entweder benutzt du eine Bibliothek die dir die Arbeit abnimmt wie zum Beispiel
OID, oder du schreibst dir selbst was. An sich würde ja eine kleine Klasse reichen, die sich den Zustand der Tastatur speichert und jeden Frame geupdatet wird.
Für dein anderes Problem verweise ich auf BlueCobolds Beitrag. Ein Zustandsautomat ist dafür die standard Lösung. Am einfachsten wäre es, wenn du dir dafür mal eine Testanwendung schreibst. Versuch deine Zustände mal mit if und else abzubilden. Danach versuchst du es mal mit Switch. Und danach schreibst du dir einen Zustandsautomaten. Vielleicht kennst du das schon von GameStates. Das ist vermutlich für viele Spieleentwickler das erste mal, dass sie damit in Berührung kommen. Wikipedia hat dazu einen ganz netten
Artikel. Ist ohne Code, also musst du deinen Kopf ein bisschen anstrengen, aber das sollte zu schaffen sein. Ansonsten könnte zu dem Thema ja auch ein Thread erstellt werden.