AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [C++] "gleichzeitige" Tastatureingaben abfragen
Thema durchsuchen
Ansicht
Themen-Optionen

[C++] "gleichzeitige" Tastatureingaben abfragen

Ein Thema von Matze · begonnen am 18. Mai 2007 · letzter Beitrag vom 18. Mai 2007
Antwort Antwort
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

[C++] "gleichzeitige" Tastatureingaben abfragen

  Alt 18. Mai 2007, 07:13
Hallo,

bei meinem Snake-Spiel gibt es einen Multiplayer-Modus, bei dem man zu zweit an einem PC gegeneinander antreten kann. Die Bewegunge der Schlangen erfolgt in einer Schleife und beim Einzelspieler-Modus bzw. Spiel gegen den PC, kann ich die Tastatureingaben so überprüfen:

Code:
while (! snakes_finished)
{
   // check if key was pressed
   if (kbhit())
   {
      // get the key
      pressed_key = getch();

      if (game_mode != PC_VS_PC)
      {
         // check pressed key
         switch (pressed_key)
         {
            case Key_Left:
               if (my_snake->direction_x != 1)
                  my_snake->set_direction('L');
               break;
            // ...
         }
      }
   }

   // move snakes ...
}
mittels kbhit() und getch() soll es möglich sein, auch mehrere Tastatureingaben zu überprüfen, nur weiß ich nicht wie. Versucht habe ich es so, doch das haut nicht hin und es wird immer nur die zuletzt gedrückte Taste ausgewertet:

Code:
// check if key was pressed
if (kbhit())
{
   while (kbhit())
   {
      // get the key
      pressed_key = getch();

      if (game_mode != PC_VS_PC)
      {
         // check pressed key
         switch (pressed_key)
         {
            case Key_Left:
               if (my_snake->direction_x != 1)
                  my_snake->set_direction('L');
               break;
            // ...
         }
      }

      if (game_mode == HUMAN_VS_HUMAN)
      {
         // check pressed key
         switch (pressed_key)
         {
            case Key_A:
               if (more_snakes[0]->direction_x != 1)
                  more_snakes[0]->set_direction('L');
               break;
            // ...
         }
      }
   }

   // move snakes ...
}
Wisst ihr, wie ich das mit den beiden Funktionen bewerkstelligen kann?

Grüße
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#2

Re: [C++] "gleichzeitige" Tastatureingaben abfrage

  Alt 18. Mai 2007, 10:45
getch() und kbhit() sind nichtstandardisierte Relikte aus DOS-Zeiten, von denen man in neueren Projekten tunlichst die Finger lassen sollte.

Du kannst das, was du willst, mit der WinAPI-Funktion GetAsyncKeyState machen.

Btw, warum benutzt du Schleifen für die Implementation des Spielablaufes? Das ist auch ein Paradigma aus der Zeit, als ein Programm den Rechner noch für sich alleine hatte. Dein Programm verbraucht dadurch unnötig CPU-Zeit, und u.U. machst du damit gar das Laufzeitverhalten von der Geschwindigkeit des Rechners abhängig. Ein besserer Ansatz wäre es, sich regelmäßig Timer-Messages schicken zu lassen.
Moritz
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#3

Re: [C++] "gleichzeitige" Tastatureingaben abfrage

  Alt 18. Mai 2007, 10:53
Zitat:
Btw, warum benutzt du Schleifen für die Implementation des Spielablaufes? Das ist auch ein Paradigma aus der Zeit, als ein Programm den Rechner noch für sich alleine hatte. Dein Programm verbraucht dadurch unnötig CPU-Zeit, und u.U. machst du damit gar das Laufzeitverhalten von der Geschwindigkeit des Rechners abhängig. Ein besserer Ansatz wäre es, sich regelmäßig Timer-Messages schicken zu lassen.
Das gilt für Anwendungen, nicht für Spiele. Timer sind ein schlechter Ansatz für Spiele. Für Spiele gilt auch heute noch, dass sie die CPU und alle anderen Ressourcen des Rechners komplett belegen dürfen. Eine andere Sache ist, dass man nicht rechnerabhängig sein sollte mit der Spielgeschwindigkeit, aber das hat nichts mit der Frage zu tun, ob man die Gameloop (daher der Name ) als Schleife oder über Events realisiert. Nicht echtzeitbasierte Spiele wie z.B. Solitär oder Minesweeper benötigen keine Schleife und sollten allgemein über Events organisiert werden, aber Timer sind für Spiele, in denen flüssige Animationen und ein flüssiger Spielablauf vorhanden sind, ein dickes No-no. Damit ist es unter Umständen sehr viel schwieriger, korrektes und flüssiges Timing zu gewährleisten, als über eine Schleife.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#4

Re: [C++] "gleichzeitige" Tastatureingaben abfrage

  Alt 18. Mai 2007, 12:35
Daß es in umfangreicheren Spielen bei eventgesteuertem Spielablauf zu Performanceproblemen kommen kann, mag sein - aber bei einem Snake-Klon? Und zumindest Multimedia-Timer sollten akkurat genug sein für den Bedarf in einem solchen Spiel.

Es kann ja gut sein, daß das kein in Spielen üblicher Ansatz ist, aber es ist nervig, wenn nicht allzu aufwendige Minispiele die CPU voll auslasten und verhindern, daß Prozesse im Hintergrund ihre Aufgabe vernünftig verrichten können. Allerdings bin ich da vielleicht etwas altmodisch - denn mit einem Mehrkernprozessor sollte dieses Problem bekanntlich nicht auftauchen.
Moritz
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#5

Re: [C++] "gleichzeitige" Tastatureingaben abfrage

  Alt 18. Mai 2007, 12:43
Um den Rechner nicht auszulasten, bedarf es immer noch keines Timer-Systems, man kann auch z.B. Sleepen, wenn das Fenster nicht mehr aktiv ist. Du hast natürlich recht, wenn man davon ausgehen kann, dass das Spiel bei weitem nicht den Rechner auslastet, kann man dafür Maßnahmen treffen, aber selbst dann ist ein Wait/Skip-System in meinen Augen immer noch eleganter als ein Timer. Das hat auch nichts mit der Genauigkeit des Timers zu tun, was ich meinte, ist, dass man z.B. nicht unbedingt garantieren kann, dass man in einem Handler den Frame fertig bekommt usw., und dann muss man nämlich doch wieder eine Wait/Skip-Logik implementieren, die sich ohne Timer in meinen Augen leichter implementiert.
Andererseits gelten meine Ausführungen oben, wie du schon sagtest, generell eher für "große" Spiele, also Spiele, die keine Minispiele sind, sondern wenigstens im Vollbildmodus laufen. Aber irgendwo muss man ja anfangen

Noch eine kleine Ergänzung mit einem halbwegs aktuellen Beispiel, nämlich xna, dass uns beiden recht gibt:
Dort hat man keine direkte Kontrolle über die Gameloop, sondern es werden lediglich die Update- und DrawFrame-Methoden vom System aufgerufen. Dabei kann man aber einerseits FixedTimeStep benutzen, d.h. einen festen Abstand zwischen den Frames, der Rückstände dadurch aufholt, dass er DrawFrame auslässt (Skipping). Wenn Update auch zu langsam ist, funktioniert die Logik nicht mehr, weil der Sinn derselben gerade der ist, dass man sich auf den festen Abstand als Zeiteinheit verlassen kann. Andererseits kann man VariableTimeStep benutzen, was nichts anderes bedeutet, als dass die Gameloop so schnell läuft, wie sie eben kann, und dann muss man sowieso time based movement (übrigens eventuell ein Suchstichwort für dich, Matze, um die von DMW erwähnte Rechnerabhängigkeit zu umgehen) benutzen.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: [C++] "gleichzeitige" Tastatureingaben abfrage

  Alt 18. Mai 2007, 13:46
Hi,

ich weiß, wie man ein Spiel programmieren sollte, nur möchte ich mich an das, was mein Prof. so verlang,t weitestgehend halten und das auch so lösen, d.h. auch, dass ich getch() und kbhit() benutzen möchte.
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#7

Re: [C++] "gleichzeitige" Tastatureingaben abfrage

  Alt 18. Mai 2007, 14:00
Sicher?

Nach meiner Erfahrung lassen sich Professoren auch auf bessere als die von ihnen vorgeschlagenen Lösungen ein - zumindest war das bei uns so, mit einer Ausnahme

Zu kbhit() und getch() hat DMW schon das einzige gesagt, was man dabei heute beachten sollte. Ansonsten wartet getch() meines Wissens darauf, dass der Benutzer eine Taste gedrückt hat und gibt diese dann zurück, weshalb man ja vorher mit kbhit() abfragt, ob eine gedrückt wurde. Mehrere Drücke müsste man dann doch einfach hintereinander mit getch() bekommen, oder?
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: [C++] "gleichzeitige" Tastatureingaben abfrage

  Alt 18. Mai 2007, 14:28
Das klappt nur nicht, aber ich sitze grad in Info und evtl. ergibt sich eine Gelegenheit, dann frag ich nachher mal. Aber sonst nehme ich DMWs Vorschlag.

Edit: Hm, er wollte schnell ins Wochenende und hat den Raum so schnell verlassen, da war alles zu spät. ^^
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz