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

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

11

14.05.2009, 10:26

glückwunsch, ihr programm hängt nun in einer endlosschlaufe und jagt die cpu auf 100% hoch :)

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

12

14.05.2009, 12:00

Ich finde diese Lösung auch nicht sehr effizient... ^^
Wenn man die Windows Header Datei schon einbindet kann man sich auch anderer Methoden bedienen die nicht so CPU fressend sind.
Da du über die Windows.h nicht gemeckert hast nehme ich an das du für Windows programmieren willst...

Wie wäre es wenn du dir mal die conio.h anschaust? Die ist für Windows und hat nicht so einen großen Overhead.

Die hat Funktionen die Zeichen von der Tastatur lesen ohne das man Enter drücken muss. Auch eine Funktion die überprüft ob der Tastaturpuffer leer ist oder nicht.
Für das Endlosschleifen Problem ist es ratsam zum einen eine Wartefunktion einzubauen die das Programm für eine kurze Zeit pausiert, für ein Spiel das später die ganzen Resourcen des PCs nutzt braucht man das aber dann nicht mehr. Und man sollte eine Abbruch bedingung einbauen, wie das eine Taste das Programm beendet.

Die Funktionen: kbhit() und getch(), Die erste Überprüft den Tastaturpuffer, die zweite liest ein Zeichen ein.

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

13

14.05.2009, 14:15

Wenn ich das versuche :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Test

#include <iostream>
#include <conio.h>

using namespace std;

int main ()
{
    char Eingabe[30];

    getch (Eingabe, 29);
    cout << Eingabe << endl;
    if (kbhit(0x30)&0x8000)
    {
        cout << "A" << endl;
    }

    return 0;
}

kommen die Fehler:

Quellcode

1
2
c:\dokumente und einstellungen\administrator\eigene dateien\programmieren\programme_i\test4\test4_2.cpp(11) : error C2660: 'getch': Funktion akzeptiert keine 2 Argumente
c:\dokumente und einstellungen\administrator\eigene dateien\programmieren\programme_i\test4\test4_2.cpp(13) : error C2660: 'kbhit': Funktion akzeptiert keine 1 Argumente


Was mach ich den falsch?

@killmichnich
Danke für die Idee. So hab ich es zum laufen gebracht:

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
// Benutzen von GetAsycKeyState

// Test

#include<iostream> 
#include <windows.h>


using namespace std; 

int main() 
{
    bool Zaehler = true;
    bool Zaehler2 = true;


    while (!(GetAsyncKeyState(0x25)&0x8000))
    {
        if (Zaehler == true)
        {
            for (int x=0; x<20; x++)
            {
                for (int y=0; y<20; y++)
                {
                    cout << "X";
                }
                cout << endl;
            }
            Zaehler = false;
            while (Zaehler2 == true)
            {
                if (GetAsyncKeyState(0x31)&0x8000)
                {
                    cout << "A" << endl;
                    Zaehler2 = false;
                }
                
            }
        }
        
    }
    system("PAUSE");

}


Trotzdem würde mich die andere Lösung interessieren!

Danke im Voraus!

Edit: Habe Codetags eingefügt!
Pi mal Daumen = 18.84955592

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

14

14.05.2009, 14:25

Hm, du hast die beiden Funktionen nicht korrekt benutzt...
Ist aber nicht schwer...

Du willst das ganze in einer Schleife haben? Ich würde es so machen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool bQuit = false;
char c;
while(!bQuit)
{
   if(kbhit())
   {
      c = getch();
      switch(c)
      {
         case 'a':
            cout << "Es wurde a gedrueckt";
         break;
      }
//20ms warten...

sleep(20);
}


Hab den Code nicht getestet, aber es sollte so funktionieren...

P.S.: Wenn du Pfeiltasten abfragen willst oder andere Sondertasten muss man etwas in die Trickkiste greifen, aber es ist auch nicht sehr schwer.

15

14.05.2009, 14:31

bQuit wird allerdings nirgends auf true gesetzt...

FLO2
Bitte für C++ Code entsprechende Code-Tags verwenden.
fka tm

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

16

14.05.2009, 14:51

Japs und es fehlt eine Klammer ^^"
Und ich habe übersehen das die Sleep()-Funktion auch nur in der Windows.h deklariert ist...

Der korrekte Code mit Sondertasten:

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
bool bQuit = false;
    char c;

    while(!bQuit)
    {
        if(kbhit())
        {
            c = getch();
            switch(c)
            {
                case 'a':
                    cout << "Es wurde a gedrueckt\n";
                break;
                //Escape beendet das Programm

                case 27:
                    bQuit = true;
                break;
                //Fall through - Eine Sondertaste wurde gedrueckt

                case 0:
                case -32:
                    cout << "Andere Taste gedrueckt\n";
                    c = getch();
                    switch (c)
                    {
                        case 59:
                            cout << "\tEs wurde F1 gedrueckt\n";
                            break;
                        case 75:
                            cout << "\tEs wurde <- gedrueckt\n";
                            break;
                        //Es wurde eine andere Taste gedrueckt

                        default:
                            cout << "\t" << (int)c << "\n";
                            break;
                    }
            break;
            //Es wurde eine andere Taste gedrueckt

            default:
                cout << (int)c << "\n";
            break;
            }
    //20ms warten...

        Sleep(20);
        }
    }


Gestestet und läuft ^^

Viele Grüße,
MCP

P.S.: Wenn jemand eine Funktion die zu ANSI C gehört und das Programm einen Moment warten lässt wie Sleep() bitte nennen ;) Mir fällt gerade nichts ein.

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

17

14.05.2009, 15:13

@ TrikkieMikkie
Tut mir leid, ich mach's jetzt richtig!

Ok. hat jetzt funktioniert danke! :D
Pi mal Daumen = 18.84955592

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

18

14.05.2009, 15:25

Schau dir meinen letzten Post an, da steht wie es geht.
Sleep gehört leider zu Windows, dafür braucht man also die Windows.h.
Woher der Fehler mit dem mehrfach definierten Symbol kommt kann ich dir nicht sagen... Welche IDE benutzt du?
Der Fehler mit kbhit() ist klar weil kbhit() keine Parameter akzeptiert...

Kbhit() prüft nur ob etwas im Tastaturpuffer steht. Ist er leer liefert kbhit() false zurück, ist etwas drinne liefert es true zurück.
Getch() liest ein einzelnes Zeichen aus dem Tastaturpuffer. Ist dieser leer wird gewartet bis etwas im Tastaturpuffer steht. (Jedoch nicht sicher in jedem Fall)

P.S.: Dann hat sich das hier ja erledigt ;) Wenn du noch Fragen hast einfach stellen ;)

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

19

14.05.2009, 20:02

Sorry war mein Fehler ich habs gelöst.
Danke! :D
Pi mal Daumen = 18.84955592

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

20

09.08.2009, 12:36

Hi
Ich habe wieder mal eine Frage zu kbhit und getch.
Ich würde gerne Tastenkombinationen benutzen.
Aber das hier funktioniert nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
if (kbhit())
{
     c=getch();
     if (c=='a' && c=='b')
     { 
           cout << "c und b wurden gedrückt"  << endl;
     }
}

Was muss ich da machen, das das funktioniert?

Danke im Voraus
Edit: Habe Gleichheitsoperatoren eingefügt
Pi mal Daumen = 18.84955592

Werbeanzeige