2012-06-12 1 views
11

Ich habe mich gefragt, wie man Code schreibt, der den Mausklick auf ein Sprite erkennen würde. Zum Beispiel:10 Pygame Mausklickerkennung

if #Function that checks for mouse clicked on Sprite: 
    print ("You have opened a chest!") 

Antwort

6

The pygame documentation for mouse events is here. Sie können entweder die Methode pygame.mouse.get_pressed in Zusammenarbeit mit der pygame.mouse.get_pos (falls erforderlich) verwenden. Verwenden Sie das Mausklick-Event jedoch über eine Main Event-Schleife. Der Grund, warum die Ereignisschleife besser ist, ist auf "kurze Klicks" zurückzuführen. Sie können diese auf normalen Computern nicht bemerken, aber Computer, die Tap-Klicks auf Trackpads verwenden, haben zu kurze Klickzeiten. Durch die Verwendung von Mausereignissen wird dies verhindert.

EDIT: auszuführen Pixel perfekt Kollisionen verwenden pygame.sprite.collide_rect() auf their docs for sprites gefunden.

+0

Wie würde ich dann Anwendung, wenn auf ein Sprite zu klicken? –

+0

@EliasBenevedes Ich habe meine Antwort mit pixelgenauen Kollisionen bearbeitet. – jakebird451

21

Ich nehme an, Ihr Spiel hat eine Hauptschleife, und alle Ihre Sprites sind in einer Liste namens sprites.

Erhalten Sie in Ihrer Hauptschleife alle Ereignisse und überprüfen Sie das Ereignis MOUSEBUTTONDOWN oder .

while ... # your main loop 
    # get all events 
    ev = pygame.event.get() 

    # proceed events 
    for event in ev: 

    # handle MOUSEBUTTONUP 
    if event.type == pygame.MOUSEBUTTONUP: 
     pos = pygame.mouse.get_pos() 

     # get a list of all sprites that are under the mouse cursor 
     clicked_sprites = [s for s in sprites if s.rect.collidepoint(pos)] 
     # do something with the clicked sprites... 

Also im Grunde müssen Sie für jede Iteration der Hauptschleife für einen Klick auf ein Sprite selbst überprüfen. Sie möchten mouse.get_pos() und rect.collidepoint() verwenden.

Pygame bietet keine ereignisgesteuerte Programmierung, wie z. cocos2d tut.

Ein anderer Weg wäre, die Position des Mauszeigers und den Status der gedrückten Tasten zu überprüfen, aber dieser Ansatz hat einige Probleme.

if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()): 
    print ("You have opened a chest!") 

Du musst eine Art Flagge einführen, wenn Sie diesen Fall behandelt, da sonst dieser Code drucken „Du eine Truhe geöffnet haben!“ jede Iteration der Hauptschleife.

handled = False 

while ... // your loop 

    if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()) and not handled: 
    print ("You have opened a chest!") 
    handled = pygame.mouse.get_pressed()[0] 

Natürlich können Sie Sprite Unterklasse und ein Verfahren is_clicked wie folgt aufgerufen hinzu:

class MySprite(Sprite): 
    ... 

    def is_clicked(self): 
    return pygame.mouse.get_pressed()[0] and self.rect.collidepoint(pygame.mouse.get_pos()) 

Also, es ist besser, den ersten Ansatz IMHO zu verwenden.

+3

Beachten Sie auch, dass die Position der Maus auch im Ereignis selbst unter 'event.pos' verfügbar ist –

3

Ich war für die gleiche Antwort auf diese Frage und nach viel Kopf suchend, dieses Kratzen ist die Antwort kam ich mit:

#Python 3.4.3 with Pygame 
import pygame 

pygame.init() 
pygame.display.set_caption('Crash!') 
window = pygame.display.set_mode((300, 300)) 
running = True 

# Draw Once 
Rectplace = pygame.draw.rect(window, (255, 0, 0),(100, 100, 100, 100)) 
pygame.display.update() 
# Main Loop 
while running: 
    # Mouse position and button clicking. 
    pos = pygame.mouse.get_pos() 
    pressed1, pressed2, pressed3 = pygame.mouse.get_pressed() 
    # Check if the rect collided with the mouse pos 
    # and if the left mouse button was pressed. 
    if Rectplace.collidepoint(pos) and pressed1: 
     print("You have opened a chest!") 
    # Quit pygame. 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False