Pygame -- Mausklick auf Objekt(oder Koordinate)

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

Hallo an alle,
die Frage ist jetzt wahrscheinlich ein bisschen dumm, aber fange jetzt seit langem wieder mit Pygame an und habe daher die Hälfte vergessen :(
Wollte also Fragen wie man merken kann das ein Mausklick auf ein bestimmtes Objekt gemacht wurde also

Code: Alles auswählen

while True:
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
aber das er eben nicht nur erkennt das ein mausklick gemacht wurde , sondern das ein mausklick auf ein bestimmtes objekt gemacht wurde.(dann soll bei mir die punktzah lvergrößert werden :D :D :D)
Iwie kriegichs net hin...


MfG Universum

PS: Habs jetzt so gemacht, aber Pygame stürtzt ständig ab:

Code: Alles auswählen

import pygame, sys, random


Punkte = 0 


pygame.init()
screen = pygame.display.set_mode([550,412])
screen.fill([255,255,255])
Objekt = pygame.image.load('Objekt.png')
Hintergrund = pygame.image.load('Explosion.jpg')
screen.blit(Hintergrund,[0,0])

for i in range(0,20):
    a = random.randint(0,350)
    b = random.randint(0,350)
    screen.blit(Objekt,[a,b])
    pygame.display.flip()
    pygame.time.delay(2000)
    screen.blit(Hintergrund,[0,0])



    



while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            pos1=pygame.mouse.get_pos()
            print pos1
            if pos1 == (a,b):   
                Punkte = Punkte + 1
                print Punkte 
                
            
            
            

Keine Sorge ist nur zum testen^^
-
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

#push#
-
deets

Was heisst "stuerzt ab"? Und das man auf genau *einen* punkt klickt - das ist wohl etwas viel verlangt. Schau dir mal die Rect-Klasse an.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was willst Du denn von uns hören, was Du nicht schon selber erkannt hast? Es gibt in `pygame` keine magische Funktion, die Dir ein "Objekt" unter dem Mauszeiger liefert. Das musst Du schon selber implementieren...

... Du fragst eben die aktuellen Koordinaten ab und musst dann in Deinem Modell gucken, welches Objekt sich an dieser Position verbirgt. Je nach Spiel / Logik können das ja sogar mehrere sein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

So hab den code verändert das er die koordinaten abfragt
aber jetzt zeigt es kein bild...

Code: Alles auswählen

import pygame, sys, random


Punkte = 0 


pygame.init()
screen = pygame.display.set_mode([550,412])
screen.fill([255,255,255])
Objekt = pygame.image.load('Objekt.png')
Hintergrund = pygame.image.load('explosion.jpg')
screen.blit(Hintergrund,[0,0])






    



while True:
    
    a = random.randint(0,350)
    b = random.randint(0,350)
    for event in pygame.event.get():
        print event.type
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type ==pygame.USEREVENT:
            for i in range(0,20):

                screen.blit(Objekt,[a,b])
                pygame.display.flip()
                pygame.time.delay(2000)
                screen.blit(Hintergrund,[0,0]) 
                
        elif event.type == pygame.MOUSEBUTTONDOWN:
            pos1=pygame.mouse.get_pos()
            if pos1 == (a,b):   
                Punkte = Punkte + 1
                print Punkte  
            
        
                
            
            
            

irgendwie versteh ich meinen fehler nicht...
-
BlackJack

@Pyanfänger: Dazu müsstest Du etwas auf's Screen-Surface „blitten” und dann `display.flip()` aufrufen. Schau mal wo Du das in Deinem Code stehen hast (übrigens in einer verwirrenden Reihenfolge) und nun erklär mal unter welchen Umständen der betreffende Code ausgeführt werden sollte?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du könntest einmal auf die Nachfragen / Postings von uns eingehen. Das motiviert potenzielle Helfer, weiterhin mit Dir zu interagieren. Momentan machst Du den Eindruck, als ignoriertest Du uns...

... zudem macht es keinen guten Eindruck wenn Du hier Code "reinrotzt", der total unaufgeräumt wirkt. Wieso sind da gefühlte 30 Leerzeilen in Deinem Code? Selbst wenn man die mittleren als logischen "Trenner" sehen wollte, so bleiben die sechs Stück am Ende unerklärbar.

Zudem existieren spezielle Python-Code-Tags: [ code=python ] [ /code] (ohne die Leerzeichen).

Ich denke in Deinem Code fehlt ein `flip` bzw. `update`.

Mehr kann man Dir im Moment eh nicht sagen, da wir das ganze ja nicht testen können. Du hast ja bisher nicht einmal beschrieben, was Du Dein Code überhaupt machen soll bzw. was Du generell erreichen willst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

Ah ok :(
Also was ich damit erreichen will ist das ein Bildschirm erscheint auf dem dieses "Objekt" so und so viele male(einstellbar) auf einen zufälligen Platz des Bildschirms springt und man es schnell anklicken muss, und die punktzahl dann addiert wird...

wegen der vorherigen Beiträge : ICh habe sie keineswegs ignoriert! Ich bin euch auch sehr dankbar ! Aber irgendwie... bin ich woh letwas behämmert :( :oops:
-
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Naja, BlackJack hat Dich ja bereits auf die "marode" Code-Stelle hingewiesen. Ich mach es noch mal deutlich:

Code: Alles auswählen

      elif event.type ==pygame.USEREVENT:
            for i in range(0,20):

                screen.blit(Objekt,[a,b])
                pygame.display.flip()
                pygame.time.delay(2000)
                screen.blit(Hintergrund,[0,0]) 
Wann wird dieser Code Deiner Meinung nach ausgeführt? Was ist ein `pygame.USEREVENT` bzw. wie wird es ausgelöst?

Hinzu kommt dann noch, dass das `delay` *nicht* im Hintergrund abläuft, sondern Deinen Code einfriert (also wenn der Rest behoben ist). So kannst Du zeitliche Verzögerung nicht umsetzen. Eine gängige Herangehensweise wäre es, mit einem `Clock`-Objekt zu arbeiten oder auf `pygame.time.set_timer` zurückzugreifen. Aber das ist erst die übernächste Baustelle ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

eigentlich soll es sofort ausgeführt werden...schließlich ist das der teil der das objekt herumhüpfen lässt...
-
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Pyanfänger hat geschrieben:eigentlich soll es sofort ausgeführt werden...schließlich ist das der teil der das objekt herumhüpfen lässt...
Ich wollte nicht wissen, was Du "hoffst", dass der Code tut, sondern, Du solltest mal *erklären* wieso Du diesen Code so geschrieben hast und wieso der diese Funktionalität erfüllen soll. Denn wenn Du das einmal angehst, wirst Du vermutlich selber drauf kommen, dass das so nicht klappen kann ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Pyanfänger: Da hüpft überhaupt nichts. Wenn es denn ausgeführt werden würde, dann wird 20 mal das selbe Objekt an die selbe Stelle „geblitted” mit einer kleinen Wartezeit. Für den Benutzer passiert scheinbar 40 Sekunden lang gar nichts. Das Programm reagiert in der Zeit auch auf keine Eingaben.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Pyanfänger hat geschrieben:eigentlich soll es sofort ausgeführt werden...
Aufgrund welcher Tatsache? Wann trifft denn die Bedingung zu, dass der Event-Typ gleich pygame.USEREVENT ist?
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

aso habs kapiert :facepalm: ! also zu hälfte... ich melde mich gleich wieder :D
-
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

Hallo,

Ich melde mich wieder mit der erfolgreichen Nachrich dass Zeug mit der Maus geschafft zu haben und denn code gesäubert habe :D
Danke an alle :)

Der Thread ist damit aber keinesfalls zuende :wink:
Sondern es wirft ganz neue Fragen auf ;)

MfG Pyanfänger :)
-
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

Also jetzt die Fragen :
( falls es verboten ist eine neue Post dafür zu erstellen bitte sagen)
Also Frage Nr.1:

Das Pause-System:

Wie kann man das Spiel pausieren so dass es beim weitermachen genau so bleibt wie beim pausieren? Ich habe ein paar Zeilen code geschrieben die es mit p pausieren und mt c( habs net hingekriegt dass es mit gleichem buchstabe weitergeht) baut es denn bildschirm wieder so auf wie vorher, aber dann sind alle timer usw weg!

Nächste Fragen kommen noch, und zwar in diese post
-
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Prinzipiell sollte man für eine neue Frage einen neuen Thread aufmachen. Verboten in dem Sinne ist die Fortführung eines alten Threads nicht, aber alleine aus einem simplen Grund bietet es sich an: Du erreichst mehr Leute ;-)

(Zudem ist das Problem auch leichter "auffindbar" für Suchende)

Wenn es inhaltlich starke Verbindungen gibt, dann verlinke einfach auf den Originalthread.

So, zum Problem: Du müsstest uns schon mal Code zeigen, damit wir Dir helfen können ;-) Also schlage ich mal vor, dass Du jetzt einen neuen Thread erstellst, in dem Du das aktuelle Problem schilderst, inkl. Quellcode und Beschreibung, was passiert, was Du stattdessen erwartet hättest oder auch einer Fehlermeldung. Sei da ruhig präzise aber auch ausführlich genug. Lies Dir Deine eigene Beschreibung ruhig mehrfach durch und denke darüber nach, ob ein Außenstehender wirklich alle notwendigen Infos bekommt.

Bei grafischen Programmen kann es auch mal ein Screenshot sein, wenn es zur Verdeutlichung hilft. (Diese kannst Du nicht direkt im Board hochladen, sondern musst einen Dienst a la flickr o.ä. benutzen)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten