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

02.11.2006, 16:04

getch() stoppt Programm -.-

hi!

Ich versuche momentan ein kleines Konsolen-"Spiel" in C++ zu schreiben.
Es soll ein Spiel sein, wo man ein Feld hat und dort fliegen von der Seite "Bälle" ( O ), die man mit einem "Korb" ( [ ) fangen muss.
Mein Problem ist gerade, dass man den Korb mit den Pfeiltasten lenkt (mittles getch)
Jetz fliegt der Ball aber nur 1 Feld im Array weiter, wenn man eine Taste drückt -.-

Wie mache ich, dass man den Korb mit den Pfeiltasten lenken kann und das Spiel währenddessen weiter läuft?

code-beispiel

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
      //Tastatur abfrage

      Taste = getch();
      
      //Bildschirm säubern

      system("cls");
      
      //"Korb" bewegen

      switch (Taste)
      {
           case (72): //UP

           {
             //Muss keiner verstehen^^

             if (*pKORB_Y != 1)
             {
               MAP[*pKORB_Y][3] = ' ';
               *pKORB_Y = *pKORB_Y - 1;
               MAP[*pKORB_Y][3] = '[';
             }
           } break;
           
           case (80): //DOWN

           {
             //Muss keiner verstehen^^

             if (*pKORB_Y != Hoehe-2)
             {
               MAP[*pKORB_Y][3] = ' ';
               *pKORB_Y = *pKORB_Y + 1;
               MAP[*pKORB_Y][3] = '[';
             }
           } break;
      } //switch

      
      //'Ball' bewegt sich

     //bisschen kompliziert, es wird einfach das alte Ball Feld im array

     //gelöscht und das nächste Feld auf der X-Achse mit dem Ball belegt


      MAP[RNDZahl][Breite-(BallZaehler)] = ' ';
      BallZaehler = BallZaehler + 1; //Ein Feld weiter, bitte ;)

      MAP[RNDZahl][Breite-(BallZaehler)] = 'O';
C++ für Spieleprogrammierer durch, zu Weihnachten ist 3D Spieleprogrammierung mit DirectX9 dran :D

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

02.11.2006, 16:15

_getch() stoppt die Programmausführung, bis eine Taste gedrückt wurde^^

Schau dir mal GetAsyncKeyState(vKey) an. Das läuft einfach weiter, auch wenn die getestete Taste nicht gedrückt ist.

babelfish

Alter Hase

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

3

02.11.2006, 16:16

Getch fragt nur einmal eine Taste ab, du musst es also mehrmals aufrufen um es mehrmals zu bewegen.
also zum Beispiel

C-/C++-Quelltext

1
2
3
4
5
6
do
{

 // Dein Code hier


} while(SpielSollBeendetWerden == false);


Aber wenn du willst dass das Spiel nicht immer auf die Eingabe wartet würde ich eine andere Methode suchen (Immerhin soll sich der Ball ja nicht nur bei Tastendruck bewegen, nehme ich Mal an).

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

02.11.2006, 16:21

AsyncKeyState fällt mir da spontan ein(kA ob das jetzt passt :D ). Einfach mal in der MSDN schauen. Viell. hilft dir das Stichwort weiter
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

babelfish

Alter Hase

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

5

02.11.2006, 16:34

Versuch' Mal folgenden Code aus um zu sehen was wir mit anhalten meinen:

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 <iostream>
#include <conio.h>

using namespace std;

#define NONE 0
#define LEFT 1
#define RIGHT 2

int main()
{
    char Eingabe;
    int Zahl = 0;
    int Position = 0;
    int Direction = LEFT;

    // Do Schleife

    do
    {
        // Inhalt leeren

        system("cls");

        // Zahl ausgeben

        cout << Zahl << endl;

        // Lücke für die Ballposition (Schlechte Lösung, klappt aber ^^)

        for(int i=0; i<Position; i++) cout << " ";

        // Der Ball

        cout << "O";

        // Abfrage

        Eingabe = getch();

        // Zahl In- oder Dekrementieren

        if(Eingabe == 72) Zahl++;
        else if(Eingabe == 80) Zahl--;

        // Den Ball bewegen

        if(Direction == LEFT){
            // Falls der Rand erreicht wurde Direktion wechseln

            if(Position <= 0) Direction = RIGHT;
            // Die Position dekrementieren

            else Position--;
        }
        else if(Direction == RIGHT){
            // Falls der Rand erreicht wurde Direktion wechseln

            if(Position >= 79) Direction = LEFT;
            // Die Position inkrementieren

            else Position++;
        }

    } while(Eingabe != '0'); // Bei Eingabe '0' -> Abbrechen


    return 0;
}

Ist nur schnell zur Demo,
Der Ball bewegt sich nur wenn du ne Taste drückst.
P.S. Er geht immer hin und her, du kannst die Richtung nicht ändern :P

Sheddex

unregistriert

6

02.11.2006, 16:38

Eine Funktion die ich mir damals geschrieben hab' um in der Konsole Pfeiltasten zu verwenden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int KeyInput(void)
{
    int ReturnValue = 0;

    _getch ();

    if (GetAsyncKeyState (VK_UP))     ReturnValue = 1;
    if (GetAsyncKeyState (VK_DOWN))   ReturnValue = 2;
    if (GetAsyncKeyState (VK_LEFT))   ReturnValue = 3;
    if (GetAsyncKeyState (VK_RIGHT))  ReturnValue = 4;
    if (GetAsyncKeyState (VK_RETURN)) ReturnValue = 5;
    if (GetAsyncKeyState (VK_SPACE))  ReturnValue = 6;
    if (GetAsyncKeyState (VK_ESCAPE)) ReturnValue = 7;

    Sleep (200);

    return ReturnValue;
}


Kann so ohne Probleme verwendet werden.

7

02.11.2006, 17:30

Danke für die Hilfe :)
Das GetAsyncKeyState hab ich gesucht.

Als Belohnung gibts das tolle Spiel xD
http://www.file-upload.net/download_02.11.06_xxrzdw.zip.html

Aber dieses system("cls"); in der Schleife nervt schon stark, gibts da nichts besseres?
Das Flimmern ist ja schrecklich :oops:

Und wenn man am Anfang einen Buchstaben eingibt :roll:
dabei habe ich ein default in der switch verzweigung -.-
C++ für Spieleprogrammierer durch, zu Weihnachten ist 3D Spieleprogrammierung mit DirectX9 dran :D

babelfish

Alter Hase

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

8

02.11.2006, 17:49

Sieht doch schonmal ganz Nett aus ^^.
Das Flimmern könntest du beheben indem du immer nur die Stellen übermalst du du verändern willst.
Such' mal nach gotoxy, damit sollte es eigentlich klappen ;).

Beliah

Treue Seele

Beiträge: 115

Wohnort: Söhlde - LK Hildesheim

Beruf: FI-Anwendungsentwicklung

  • Private Nachricht senden

9

02.11.2006, 18:06

Zitat von »"void"«


[...]
Und wenn man am Anfang einen Buchstaben eingibt :roll:
dabei habe ich ein default in der switch verzweigung -.-


Wie fragst du das denn ab? Wenn du cin benutzt könnteste mal cin.ignore() probieren. Die Eingabetaste könnte noch im Eingabepuffer stehen.
Debuggers don't remove bugs, they only show them in slow motion.

Google Suche ohne Werbung und Cookies: Scroogle

Derzeitige(s) Freizeitprojekt(e)

Sheddex

unregistriert

10

02.11.2006, 20:23

Achso, hab' garnicht kapiert dass das nicht auf eine Eingabe warten soll sondern die ganze Zeit läuft...

Das Spiel ist ganz nett ;)

Werbeanzeige