@cpp-n00b sagte in Tastenprellen?:
@DocShoe
Mit copy & paste in die besagte Stelle eingefügt und limits und ios nach einem Test inkludiert.
Der Befehl wird nicht mehr ausgeführt. Das Programm bleibt "stehen". Dasselbe Verhalten wenn ich die Includes einfüge. Noch eine Idee? Ich mag es Quick & Dirty...
@wob
Danke für den Tipp, das werde ich mir anschließend mal durchlesen und schauen ob das besagtes Problem löst.
Ja, war auch ein total bescheuerter Vorschlag von mir. Aus irgendwelchen Gründen bin ich davon ausgegangen, dass
std::cin.ignore( std::numeric_limits<std::streamsize>::max() );den Eingabepuffer leert. Tut`s aber nicht.
std::cin >> ctrl; ein einzelnes Zeichen liest und sofort zurückkehrt (also nicht auf Enter wartet)
MIt deinem std::cinAnsatz wird das eher schwierig, ist es wirklich beabsichtigt, dass jede Eingabe mit Enter bestätigt werden soll?
Nächster Quick&Dirty Vorschlag (dieses mal getestet ;)):
char ch;
std::cin >> ch; // Liest das erste Zeichen aus dem Eingabepuffer
std::cin.clear(); // löscht die übrigen Zeichen aus dem Eingabepuffer
Damit wird nur das erste Zeichen der Eingabe behandelt. Der Benutzer muss weiterhin die Eingabe mit Enter bestätigen, was dazu führen kann, dass sowas wie "wabc77uz0ä?" im Eingabepuffer steht, aber nur das erste Zeichen behandelt wird.
Leider gibt es für dein Problem keine Standardlösung in C++, möglicherweise unterstützt dein Compiler die Funktionen getch() und kbdhit(), unter Umständen mit einem vorangestellten Underscore. Das sind aber keine Funktionen, die im C oder C++ Standard definiert sind.
char ch = getch();
Oder du benutzt, wie @wob schon vorgeschlagen hat, plattformspezifische Funktionen.
Noch ein genereller Verbesserungshinweis:
Trenne Funktionalitäten. Das Einlesen und Behandeln von Eingaben in einer Funktion ist unschön, das könnte man besser so umsetzen:
void run_game_loop()
{
while( !terminated() )
{
char const ch = read_console_input();
process_console_input( ch );
}
}
PS:
Üblicherweise möchte man nicht auf eine Benutzereingabe warten, sondern arbeitet mit einer ständig laufenden Schleife, die auch ohne Benutzereingabe weiterläuft, um div. andere Dinge erledigen zu können (NPCs tun irgendwas, die Welt verändert sich, Zeit läuft weiter, etc.) Das Ganze läuft dann vermutlich auch nicht einfach mehr unkontrolliert in einer Schleife, sondern ein Schleifendurchlauf wird in einem bestimmten, festen Intervall ausgeführt, z.b. alle 100ms. Für alle Ereignisse gibt es dann einen Countdown, bei dessen Ablauf dieses Ereignis behandelt wird und der Countdown zurückgesetzt wird.