Pygame Maus Klick auf Button

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
PPGProductions
User
Beiträge: 5
Registriert: Mittwoch 13. April 2011, 14:48

Hi,

ich bin gerade dabei ein Spiel in Python zu programmieren. Vom Spiel bin ich allerdings noch ein bisschen weg, ich arbeite momentan an einem Menü. Allerdings weiß ich nicht wirklich wie man es anstellt, durch einen Klick (mit dem linken Mauszeiger) auf meinen erstelllten Menübutton ein bestimmtes Ereignis auszuführen. Das heißt: ich möchte, dass wenn der Mauszeiger über dem Button ist und ich einen Linksklick mache, etwas ausführen. Aber wie kann ich dem Mauszeiger mitteilen, wo sich der Button befindet und dann freigeben, dass bei einem Klick etwas passiert?

Wie man bei einem normalen Mausklick (d.h. über der gesammten fläche, nicht nur über dem button) etwas ausführt habe ich schon gemacht, das sieht dann so aus: (funktioniert so weit auch :D )

Code: Alles auswählen

    if event.type == MOUSEBUTTONDOWN:
        führeEtwasAus()
Ich hoffe ihr könnt mir weiter helfen, da mein Spiel/Menü in Pygame so ziemlich auf einem Mouseeffect aufbaut!


Screenshot

Bild
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

PPGProductions hat geschrieben:Aber wie kann ich dem Mauszeiger mitteilen, wo sich der Button befindet und dann freigeben, dass bei einem Klick etwas passiert?
Umgekehrt. Bei einem Klick stellst du fest, ob du in dem Bereich bist auf den du den Button gemalt hast und reagierst entsprechend.
PPGProductions
User
Beiträge: 5
Registriert: Mittwoch 13. April 2011, 14:48

nee sry, das mit dem PIG und PUG hilft mir auch nicht weiter, da ich das Ganze lieber manuell programmieren möchte und nicht durch einen Generator oder ähnlichem.

Vielleicht kann mir ja noch jemand einen anderen Tipp geben, oder was am besten wäre einen beispielcode.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Dein Button besteht doch bestimmt aus einem pygame.Surface und damit sollte es ein pygame.Rect beinhalten, dies hat eine Methode "collidepoint()" und dein "event" hat bei MOUSEBUTTONDOWN ein "pos"-Attribute. Nun noch 1 und 1 zusammen zählen, hier nochmal lesen: http://www.pygame.org/docs/ref/rect.htm ... llidepoint und dann sollte man es rausbekommen haben.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
deets

PPGProductions hat geschrieben:nee sry, das mit dem PIG und PUG hilft mir auch nicht weiter, da ich das Ganze lieber manuell programmieren möchte und nicht durch einen Generator oder ähnlichem..
PIG ist ein Generator, aber PUG "nur" eine GUI. Wenn du natuerlich darauf bestehst, das alles selbst zu erfinden :)
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@deets
Für ein simples Menü, braucht es nun wirklich nicht viel. Und Buttons, Checkbuttons und Radiobuttons sind schnell gebaut. Aber Slider, ListBox und Konsorten werden dann schon schwieriger. Das schlimmste sind dann aber die Positionierung (zumindest, wenn man wie ich ein Abneigung gegen absolute Positionierungen hat), dennoch solange diese Grenze nicht erreicht ist, kann man es sich in pygame auch selber basteln.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
PPGProductions
User
Beiträge: 5
Registriert: Mittwoch 13. April 2011, 14:48

OK, also ich hab das jetzt so verstanden, dass ich quasi ein Rechteck mache und das dann über meinen Button gelegt wird. Und wie muss ich das dann in mein Programm einbinden?

Code: Alles auswählen

    Rect.collidepoint(x, y):
        return bool
    Rect.collidepoint((x,y)):
        return bool
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Die Grundlagen von Python und das arbeiten mit einer Dokumentation sind dir aber geläufig, oder?

Du "blittest" doch dein Button als Bild auf einen "pygame.Surface", bei dem Stand würde ich sogar sagen auf direkt auf den Screen welchen du bei "pygame.display.set_mode" geliefert bekommst. Jedes Surface, also auch Bilder die du über "pygame.image.load" instanzierst, haben eine Methode ".get_rect()". Diese muss du Aufrufen, dann erhälts du ein "pygame.Rect", dieses hat dann die "collidepoint()"-Methode wo du das Event-Attribute "event.pos" in der "MOUSEBUTTONDOWN" Abfrage übergibst. Das Ergebnis ist ein Wahrheitswert und anhand diesen weißt du ob dein Bild angeklickt wurde.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
PPGProductions
User
Beiträge: 5
Registriert: Mittwoch 13. April 2011, 14:48

Tut mir leid, allzu gut kenne ich mich mit Python bzw. Pygame leider nicht aus, ich kenne mich mit den Grundbefehlen von Python aus aber mit Pygame direkt habe ich leider noch nicht so viel erfahrung,
ich weis zum Beispiel nicht, wie ich die Methode ".get_rect()" aufrufen kann. könnt ihr mir vielleicht einen Link schicken, damit ich mir iwo das mit den Methoden und events anschauen kann?

Vielleicht kann ja mal noch jemand einen Beispielcode erstellen, da ich momentan nicht ganz weis wo ich anfangen soll mit dem ".get_rect()" und mit "pygame.Rect" usw... wenn ich dann so eine Beispielvorlage hätte, (muss ja nix großartiges sein^^) weis ich wenigstens wo ich anfangen muss und wie das funktioniert.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

PPGProductions hat geschrieben:ich weis zum Beispiel nicht, wie ich die Methode ".get_rect()" aufrufen kann. könnt ihr mir vielleicht einen Link schicken, damit ich mir iwo das mit den Methoden und events anschauen kann?
http://www.pygame.org/docs/ref/surface. ... e.get_rect

Fangen wir doch mal vorne an, dann kann man die Logik dahinter besser erklären, da wir dann auf deinem Wissensstand aufsetzen. Wie, also mit welchem Code, bringst du denn im Moment den Button auf den Bildschirm?
Antworten