Вы должны реализовать метод clicked
по-другому, потому что в вашем приложении должен быть только один цикл обработки событий, а не один в каждом экземпляре кнопки. pygame.event.get()
очищает очередь событий, поэтому вызов ее несколько раз за кадр вызовет проблемы.
Предлагаю передать события кнопкам. В этом (очень простом) примере я передаю события pygame.MOUSEBUTTONDOWN
методу clicked
, а затем проверяю, совпадает ли event.pos
(позиция мыши) события с прямоугольником. Если он возвращает True
, я делаю что-то в цикле событий в основной функции.
import pygame as pg
class Button:
def __init__(self, pos):
self.image = pg.Surface((100, 40))
self.image.fill(pg.Color('dodgerblue1'))
self.rect = self.image.get_rect(center=pos)
def clicked(self, event):
"""Check if the user clicked the button."""
# pygame.MOUSE* events have an `event.pos` attribute, the mouse
# position. You can use `pygame.mouse.get_pos()` as well.
return self.rect.collidepoint(event.pos)
def main():
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
button = Button((100, 60))
number = 0
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
elif event.type == pg.MOUSEBUTTONDOWN:
# Pass the MOUSEBUTTONDOWN event to the buttons.
if button.clicked(event):
number += 1 # Do something.
print('clicked', number)
screen.fill((30, 30, 30))
screen.blit(button.image, button.rect)
pg.display.flip()
clock.tick(60)
if __name__ == '__main__':
pg.init()
main()
pg.quit()
Если вам нужна кнопка с несколькими изображениями, вы можете использовать нечто подобное классу кнопок здесь (первое дополнение) или искать более сложные классы кнопок для пигмеев.