Проблема с анимацией в Pygame
Проблема с анимацией: при нажатии кнопки начинается анимация, при этом на экране пропадает и кнопка, и счёт, — остаётся только фон и анимация. После проигрывания анимации всё восстанавливается, как это исправить?
Код:
class Game():
def __init__(self):
pygame.init()
pygame.font.init()
self.my_font = pygame.font.SysFont('Comic Sans MS', 30)
self.screen = pygame.display.set_mode((800, 700))
pygame.display.set_caption("Byrmalda")
self.bg_img = pygame.image.load("bg_img.png")
self.back = pygame.transform.scale(self.bg_img, (800, 700))
self.screen.blit(self.back, (0, 0))
self.clock = pygame.time.Clock()
self.FPS = 60
self.temp = 0
self.temp_score = 0
self.default_score = 100
self.rand = randint(65, 80)
self.im_list_1 = [pygame.image.load("ph_2.png"), pygame.image.load("ph_apl.png"),
pygame.image.load("ph_1_grape.png")]
# first photo
self.im = Image(self, 200, 180, 500, 200, "ph_2.png")
self.im_1 = Image(self, 360, 180, 500, 200, "ph_apl.png")
self.im_2 = Image(self, 520, 180, 500, 200, "ph_2.png")
# self.anim = Imanim(self, self.im_list_1)
def spin(self):
for i in range(self.rand + 2):
self.rand_1 = random.randint(0, 2)
self.rand_2 = random.randint(0, 2)
self.rand_3 = random.randint(0, 2)
self.screen.blit(self.im_list_1[self.rand_1], (200, 180))
self.screen.blit(self.im_list_1[self.rand_2], (360, 180))
self.screen.blit(self.im_list_1[self.rand_3], (520, 180))
pygame.display.update()
i += 1
time.sleep(0.09)
def start(self):
while True:
self.clock.tick(self.FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
self.screen.blit(self.back, (0, 0))
if self.temp == 0:
self.im.blitmi()
self.im_1.blitmi()
self.im_2.blitmi()
self.but = Button(205, 500, 400, 100, 'Spin', self.screen, self.spin)
self.but.run()
self.default_score -= 5
self.text = f"score {self.default_score}"
self.txt = self.my_font.render(self.text, False, (255, 255, 255))
self.screen.blit(self.txt, (360, 75))
pygame.display.flip()
pygame.display.update()
if __name__ == '__main__':
by = Game()
by.start()
Ответы (1 шт):
Потому что вы по кнопке начинаете крутить цикл, отдельный от основного вашего цикла обработки событий и отрисовки. По кнопке нужно выставлять некий статус, который уже обрабатывать в основном цикле. События не должны быть долгими и не должны прерывать основной цикл обработки событий и отрисовки. В общем, грубо говоря в методе spin
выставляйте некую переменную, скажем spin_num
, которая до этого была равна 0
, в self.rand + 2
и в основном цикле while
смотрите её значение и обрабатывайте так, как будто вы внутри цикла for
находитесь, который у вас в методе spin
.
В общем, что-то такое:
def __init__(self):
...
self.spin_num = 0
...
...
def spin(self):
self.spin_num = self.rand + 2
...
def start(self):
while True:
...
if spin_num:
self.rand_1 = random.randint(0, 2)
self.rand_2 = random.randint(0, 2)
self.rand_3 = random.randint(0, 2)
self.screen.blit(self.im_list_1[self.rand_1], (200, 180))
self.screen.blit(self.im_list_1[self.rand_2], (360, 180))
self.screen.blit(self.im_list_1[self.rand_3], (520, 180))
spin_num -= 1
pygame.display.flip()
pygame.display.update()