I assume your game has a main loop, and all your sprites are in a list called
In your main loop, get all events, and check for the
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...
So basically you have to check for a click on a sprite yourself every iteration of the mainloop. You’ll want to use mouse.get_pos() and rect.collidepoint().
Pygame does not offer event driven programming, as e.g. cocos2d does.
Another way would be to check the position of the mouse cursor and the state of the pressed buttons, but this approach has some issues.
if pygame.mouse.get_pressed() and mysprite.rect.collidepoint(pygame.mouse.get_pos()): print ("You have opened a chest!")
You’ll have to introduce some kind of flag if you handled this case, since otherwise this code will print “You have opened a chest!” every iteration of the main loop.
handled = False while ... // your loop if pygame.mouse.get_pressed() and mysprite.rect.collidepoint(pygame.mouse.get_pos()) and not handled: print ("You have opened a chest!") handled = pygame.mouse.get_pressed()
Of course you can subclass
Sprite and add a method called
is_clicked like this:
class MySprite(Sprite): ... def is_clicked(self): return pygame.mouse.get_pressed() and self.rect.collidepoint(pygame.mouse.get_pos())
So, it’s better to use the first approach IMHO.