Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.07.2012, 09:10

[C++] Herunterzählen und gleichzeitig auf Tastatureingaben reagieren

Hallo,
ich programmiere seit ein paar Wochen in C++ und bin noch Einsteiger. Hoffe hier bin ich richtig.

Meine Ausgangssituation ist folgende:
Ich möchte eine Konsolenanwendung für Windows programmieren.
Hierbei soll es sich später um ein Quiz für 2 Spieler handeln. Jeder Spieler bekommt eine Taste zugewiesen
mit der er antworten kann. Wenn Spieler 1 z.B. seine Taste "Q" drückt und schneller ist als sein Gegenspieler,
darf er die gestellte Frage beantworten.
Da es aber auch Punktabzüge für falsche Antworten geben soll, kann es möglich sein, dass kein Spieler antworten möchte,
wenn die Frage zu schwierig ist. In diesem Fall soll 10 Sekunden gewartet werden und die Frage geschoben werden,
wenn niemand seine Spielertaste drückt.

Als Lösungsansatz dachte ich an eine Schleife, die mit getch() auf Eingaben wartet und diesen Befehl immer
wieder ausführt, solange die Zeit von 10 Sekunden noch nicht erreicht ist oder noch keine Taste gedrückt wurde.
Als Bedingung soll quasi die Zeit überprüft werden.
Damit stellt sich mir aber das Problem, dass das Programm eventuell in der Überprüfung der Schleifenbedingung
steckt, wenn eine Eingabe gemacht wird.
Dadurch würde diese ja nicht registriert werden.

Ich hoffe ich konnte das Problem verständlich schildern. Ich suche also nach
einer Lösung permanent auf eine Eingabe reagieren zu können und gleichzeitig eine Zeit zu zählen.

Vielen Dank schon im Voraus.

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

2

12.07.2012, 09:15

wenn du auf Tastatureingaben sofort reagieren möchtest, dann wird wohl ein sog. keylistener der Weg zum Ziel sein.
Der muss natürlich in eine Schleife gepackt werden.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

12.07.2012, 11:01

Damit stellt sich mir aber das Problem, dass das Programm eventuell in der Überprüfung der Schleifenbedingung
steckt, wenn eine Eingabe gemacht wird.
Dadurch würde diese ja nicht registriert werden.


Hattest du damit ein konkretes Problem? Denn i.A. ist ein Schleifendurchlauf viel schneller als der Benutzer eine Taste drücken kann.
@D13_Dreinig

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

4

12.07.2012, 16:26

es gibt verschiedene Möglichkeiten, wie man an das Problem ran gehen könnte

einerseits könntest du dich an Wiragos Rat halten
allerdings weiß ich nicht, in wie weit es aufgrund deiner Vorkenntnisse sinnvoll wäre
und ich denke, ein Keylistener an sich würde wohl nicht ausreichen

andererseits könntest du, da es ein sehr einfaches Konsolenprogramm ist, schauen, ob du die Abfrage nach einer Taste über einen definierten Zeitraum laufen lassen kannst oder ob du die zuletzt gedrückte Taste bekommst, ohne zu warten
der 2. Fall ist dabei fast der gleiche, wie der erste, nur mit dem Unterschied, dass du das Warten selbst anregen musst
ansonsten würde es so aussehen, dass du auf eine Eingabe wartest (oder wartest und schaust, ob es eine Eingabe gab) und abhängig von der Eingabe (oder fehlenden Eingabe) die Antwort einer der beiden spieler abfragst oder mit der nächsten Frage fortfährst


für den Anfang ist diese Lösung evtl. etwas einfacher
für später solltest du dir aber merken, dass du nicht so vorgehen solltest
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

5

12.07.2012, 17:38

Vielen Dank für die vielen hilfreichen Antworten.
Hattest du damit ein konkretes Problem? Denn i.A. ist ein Schleifendurchlauf viel schneller als der Benutzer eine Taste drücken kann.
Habe das noch nicht ausprobiert, aber dachte mir, dass das Probleme geben
könnte. Ich weiß nicht wie wahrscheinlich das ist. Aber ich fänd es sehr ärgerlich,
wenn eine Eingabe nicht berücksichtigt werden würde.



wenn du auf Tastatureingaben sofort reagieren möchtest, dann wird wohl ein sog. keylistener der Weg zum Ziel sein.
Der muss natürlich in eine Schleife gepackt werden.

Danke für den Tipp. Habe nach keylistener gegoogelt und bin dabei auf die Funktion GetAsyncKeyState() gestoßen.

Habe daraufhin versucht diese Abfrage zu programmieren.
Es funktioniert alles so, wie ich das wollte und danke euch für die Hilfe.


Kriege es leider nicht hin den Quellcode zu posten, da sich die
Zeilenumbrüche dann so verschieben, dass das ganz unübersichtlich wird.
Ist das hier im Forum auf 10 Zeilen Quellcode begrenzt?
Zumindest die Vorschau lässt darauf schließen, dass der gesamte Code in 10 Zeilen gequetscht wird.

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

6

12.07.2012, 20:03


Habe daraufhin versucht diese Abfrage zu programmieren.
Es funktioniert alles so, wie ich das wollte und danke euch für die Hilfe.


Kriege es leider nicht hin den Quellcode zu posten, da sich die
Zeilenumbrüche dann so verschieben, dass das ganz unübersichtlich wird.
Ist das hier im Forum auf 10 Zeilen Quellcode begrenzt?
Zumindest die Vorschau lässt darauf schließen, dass der gesamte Code in 10 Zeilen gequetscht wird.


eigentlich ist keine Beschränkung vorhanden soweit ich weis. Aber solange alles funktioniert passts ja ;)

Werbeanzeige