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

04.03.2009, 13:24

[Erledigt] While Schleife bei Tastendruck beenden...

Hallo! (mal wieder) ;)

Ich bin ja gerade dabei ein Pacman Spiel für die Konsole zu programmieren. Wer Pacman kennt weiß ja das sich da diese Monster die ganze Zeit im Labyrinth herumbewegen und das sich der Pacman nur bewegt wenn man eine bestimmte Pfeiltaste drückt. Dazu habe ich mir folgendes überlegt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
while(Taste für Beenden nicht gedrückt wurde)
{
   if(Taste für Bewegung von Pacman gedrückt wurde)
   {
      Pacman bewegen;
   }
   Monster immer bewegen;
}


Meine Frage bezieht sich zuerst einmal auf das while(Taste für Beenden nicht gedrückt wurde). Ich habe versucht while(_getch() != z.B. 'w' für Hoch) aber irgendwie geht das nicht.

Dann habe ich am Anfang vom Buch 3D-Spiele-Programmierung gelesen das man auch mit der Zeit arbeiten muss damit das alles auf jedem Rechner gleichschnell läuft. Da steht ja in etwa folgendes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
while(Nicht beendet wurde)
{
   dwTime1 = timeGetTime();

   renderGame(fTime);
   MoveGame(fTime);

   dwTime2 = timeGetTime();

   // Zeit eines Schleifendurchlaufs in Sekunden

   fTime = (float)(dwTime2-dwTime1)/1000.0f; }


Wozu wird da denn den Funktionen renderGame() und MoveGame() die Variable fTime übergeben. Was wird denn dann damit in den Funktionen angestellt?

Schonmal danke falls mir jemand helfen kann! 8)
"Der Wald wäre sehr leise, wenn nur die begabtesten Vögel singen würden."

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

04.03.2009, 14:01

Zu deiner ersten Frage: http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx

3

04.03.2009, 19:21

Ja das funktioniert. Gibt es auch eine Funktion die mir den VirtualKey der jeweiligen Pfeiltaste die gedrückt wurde zurückgibt?
"Der Wald wäre sehr leise, wenn nur die begabtesten Vögel singen würden."

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

04.03.2009, 19:53

In der Message Schleife kannst du das in etwa so machen. Aber direkt eine Funktion gibt es da nicht.

5

04.03.2009, 20:12

Ich hab da was bei MSDN gefunden - heißt ReadConsoleInput und erwartet als zweiten Parameter einen Pointer auf ein INPUT_RECORD Array. In der INPUT_RECORD Struktur kann man dann über Event.KeyEvent.uChar.AsciiChar die letzte Inputtaste abfragen ... hoffe ich mal ... aber bisher bekomme ich nur komische Ausgaben. Habe dazu folgenden Code geschrieben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
INPUT_RECORD Input[4]; // Das Array

INPUT_RECORD* pInput; // Der Pointer


HANDLE hConIn = GetStdHandle(STD_INPUT_HANDLE);

while(!GetAsyncKeyState(VK_ESCAPE))
{
   ReadConsoleInput(hConIn, pInput, 4, NULL);
}

cout << Input[0].Event.KeyEvent.uChar.AsciiChar << endl;
cout << Input[0].Event.KeyEvent.wVirtualKeyCode << endl;
_getch();
return 0;
Also das Ziel ist halt die gedrückte Taste zurückzubekommen.

Zitat

In der Message Schleife kannst du das in etwa so machen. Aber direkt eine Funktion gibt es da nicht.
Kann ich denn bei einer Konsolenanwendung auch eine Messageschleife einbauen?
"Der Wald wäre sehr leise, wenn nur die begabtesten Vögel singen würden."

6

04.03.2009, 21:01

Zitat von »"Andreas2"«

Kann ich denn bei einer Konsolenanwendung auch eine Messageschleife einbauen?

klar - könnte sogar vom Konsolenfenster klappen (GetConsoleWindow() fürs fensterhandle)

7

04.03.2009, 23:01

Kann mir vielleicht jemand mal ein kleines Beispiel dazu posten wie so eine Message Schleife aufgebaut sein muss die je nach Tastatureingabe eine Variable erhöht und als Handle ein GetConsoleWindow() verwendet?
"Der Wald wäre sehr leise, wenn nur die begabtesten Vögel singen würden."

8

08.03.2009, 10:35

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <windows.h>

LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam);


int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
                    LPSTR lpcmdline, int ncmdshow)
{
  HWND       hWnd;        // Fenster-Handle

  MSG        message;     // Nachricht


  hWnd = GetConsoleWindow();

  if (hWnd == NULL)
    return (0);

  while (GetMessage (&message, NULL, 0, 0) )
  {
    TranslateMessage (&message);
    DispatchMessage (&message);

  }

  return (int)(message.wParam);

}

LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {
    case WM_DESTROY:
    {
      PostQuitMessage (0);
      return (0);

    }
    case WM_KEYDOWN:
    {
      switch (wParam)
      {
        case VK_ESCAPE:
        {
          PostQuitMessage (0);
          return (0);

        }
      }
    } break;
  } 

  return (DefWindowProc (hWnd, message, wParam, lParam) );

}


So?
"Der Wald wäre sehr leise, wenn nur die begabtesten Vögel singen würden."

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

08.03.2009, 11:04

Klappts denn?

10

08.03.2009, 16:38

vergiß WinMain, da hast du eben normalerweise kein Konsolenfenster. mach ne konsolenanwendung (ganz normale int main) aber mach den rest so, dann müsste es klappen.

Werbeanzeige