Frage von keepalive, 45

Auf Mausklick warten (WinBGIm mit Orwell Dev-C++)?

Hallo, ich bin dabei ein kleines Spiel zu erstellen, in diesem man auf bestimmte Farben klicken soll. Das Spiel an sich ist fertig, doch es funktioniert leider nur wenn ich vor einem Mausklick eine Taste betätige. Wenn ich das getch() entferne, dann hängt sich das Programm auf, da der Computer ununterbrochen beschäftigt ist.. Hier eine Kurzfassung des Programms:

#include <graphics.h>
#include <iostream>
using namespace std;

main()
{
int gdriver = DETECT, gmode;    
int x, y, color;
  
initgraph(&gdriver,&gmode,"");
    
while(1)
{   
    getch(); //  Statt auf Tastendruck hier auf Mausklick warten...
    getmouseclick(WM_LBUTTONDOWN, x, y);
    color = getpixel(x,y);
    cout << color;
}
    
}
Antwort
von ralphdieter, 19

Da scheinst Du etwas grundlegend nicht verstanden zu haben:

In einer GUI-Anwendung werden üblicherweise erst die Fenster initialisiert, dann die Event-Loop gestartet. Das ist eine Funktion, die auf Maus-, Tastatur- und andere Ereignisse wartet, und diese an das passende GUI-Objekt weiterleitet. Alle Fenster, Buttons, usw. besitzen dazu einen Eventhandler, den Du natürlich für deine Farbfelder selbst schreiben musst.

Willst Du diese Event-Loop unbedingt selbst schreiben, solltest Du in der Endlosschleife wenigstens ein usleep(10000) einbauen (für 10ms Pause). In einem Beispiel aus dem Netz wird delay(200) statt usleep() gerufen. Wahrscheinlich ist delay() in graphics.h dabei.

Kommentar von ralphdieter ,

Hab' gerade gegoogelt: WinBGIm bietet wirklich nur Graphik in der DOS-Box. Da ist also nix mit Fenstern, und die Event-Loop musst Du tatsächlich selbst schreiben.

Also fehlt in deinem Code tatsächlich nur ein delay().

Kommentar von keepalive ,

Danke. Ich hatte es erst mit windows.h und Sleep probiert. Mit delay kann ich selbst eine Millisekunde angeben, ohne dass sich das Programm aufhängt (y). (Wie ich darauf einfach nicht kam, wenn schon etliche Beispiele am Ende von Programmen kbith mit delay verwenden..).
Ich hätte zwar echt gerne etwas wie getch für Mausklicks, um unnötigen Output zu vermeiden, ̶d̶̶o̶̶c̶̶h̶̶ ̶̶d̶̶a̶̶ ̶̶e̶̶h̶̶ ̶̶n̶̶u̶̶r̶̶ ̶̶i̶̶m̶̶m̶̶e̶̶r̶̶ ̶̶e̶̶i̶̶n̶̶e̶̶ ̶-̶1̶̶ ̶̶a̶̶u̶̶s̶̶g̶̶e̶̶g̶̶e̶̶b̶̶e̶̶n̶̶ ̶̶w̶̶i̶̶r̶̶d̶̶,̶̶ ̶̶w̶̶e̶̶n̶̶n̶̶ ̶̶n̶̶i̶̶c̶̶h̶̶t̶̶ ̶̶g̶̶e̶̶k̶̶l̶̶i̶̶c̶̶k̶̶t̶̶ ̶̶w̶̶u̶̶r̶̶d̶̶e̶̶,̶̶ ̶̶k̶̶a̶̶n̶̶n̶̶ ̶̶i̶̶c̶̶h̶̶ ̶̶d̶̶a̶̶s̶̶ ̶̶s̶̶i̶̶c̶̶h̶̶e̶̶r̶̶l̶̶i̶̶c̶̶h̶̶ ̶̶s̶̶c̶̶h̶̶n̶̶e̶̶l̶̶l̶̶ ̶̶b̶̶e̶̶h̶̶e̶̶b̶̶e̶̶n̶̶.̶

Habe beim Schreiben bemerkt, dass ich das Outputproblem sogar bereits im fertigen Programm "behoben" habe <3:

colorclick:
delay(1);
getmouseclick(WM_LBUTTONDOWN, x, y); //Linke Maustaste gedrückt? -> XY-Koordinaten
color = getpixel(x,y); //Farbe bei XY-Koordinaten

if (color == 4)
{
field =1;
}
else if (color == 1)
{
field =2;
}
else if (color == 2)
{
field =3;
}
else if (color == 14)
{
field =4;
}
else
{
goto colorclick;
}

(Ich weiß, dass goto umstritten ist, doch ob es Sinn macht da stattdessen eine Schleife rumzupacken...?)


Jedenfalls.. Dank euch kann dieses wunderbare Spiel nun mit der Maus gespielt werden <3: http://i.imgur.com/MMI5wtl.png (Kleinigkeiten wie Output passe ich noch an. Für den Spieler sind Koordinaten und co. ja irrelevant).

Kommentar von keepalive ,

(Noch eine kurze Anmerkung, da das von mir etwas unbedarft ausgedrückt wurde: Natürlich meinte ich mit Outputproblem nicht wirklich den Output durch cout, sondern dass wenn ein anderer Farbwert als rot, grün, blau oder gelb in color steht. Konnte ja einfach durch einen weiteren Fall mit Sprung zurück behoben werden, wie man in meinem Codeausschnitt sieht.)

Sorry, hatte gar nicht bemert, dass mir nur eine Person geantwortet hatte und dann nochmal einen Kommentar hinterlassen hatte.
(Ich erlebe es ziemlich selten dass jemand nochmal über das, was er antwortete, nachdenkt und dann noch weitere Informationen hinterherschiebt, wenn möglich/nötig. Ich bin positiv überrascht)

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten