Ответ 1
Я предполагаю, что ваша игра имеет основной цикл, и все ваши спрайты находятся в списке под названием sprites
.
В своем основном цикле получите все события и проверьте событие MOUSEBUTTONDOWN
или MOUSEBUTTONUP
.
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...
Итак, в основном вы должны проверить на клик на спрайт на каждой итерации mainloop. Вы захотите использовать mouse.get_pos() и rect.collidepoint().
Pygame не предлагает программирование, управляемое событиями, например. cocos2d.
Другой способ - проверить положение курсора мыши и состояние нажатых кнопок, но этот подход имеет некоторые проблемы.
if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()):
print ("You have opened a chest!")
Вам нужно будет ввести какой-то флаг, если бы вы обработали этот случай, так как иначе этот код напечатает "Вы открыли сундук!". каждая итерация основного цикла.
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]
Конечно, вы можете подклассом Sprite
и добавить метод под названием is_clicked
следующим образом:
class MySprite(Sprite):
...
def is_clicked(self):
return pygame.mouse.get_pressed()[0] and self.rect.collidepoint(pygame.mouse.get_pos())
Итак, лучше использовать первый подход IMHO.