Как сделать так, чтобы Pygame time.delay () запускался без остановки моего окна? - PullRequest
0 голосов
/ 06 декабря 2018

У меня возникли проблемы с Pygame.Я использую Mac High Sierra, использую Python 3 и использую Spyder в качестве компилятора.Я просто пытаюсь запустить простую анимацию, но функция time.delay () не работает.Всякий раз, когда я запускаю свой код, окно пигмеи открывается, остается серым и не заполняется белым до истечения всех временных задержек.Затем он отображает мой белый экран и окончательное местоположение круга.

Как заставить функцию time.delay работать должным образом, не замораживая окно пигмея?

import pygame, sys

pygame.init()

screen = pygame.display.set_mode([640,480])
screen.fill([255,255,255])

pygame.draw.circle(screen, [255,0,255], [50,50],50, 0)
pygame.display.flip()

for x in range(5,640,5):
    pygame.time.wait(20)
    pygame.draw.rect(screen, [255,255,255],[x-5,0,100,100],0)
    pygame.draw.circle(screen, [255,0,255], [50+x,50],50, 0)
    pygame.display.flip()


while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

1 Ответ

0 голосов
/ 06 декабря 2018

Отлично работает на моем компьютере.Сложно сказать, но я считаю, что проблема заключается в дизайне кода.Как правило, все рисование и анимация должны происходить в основном цикле (while True), и нет необходимости добавлять какие-либо временные задержки.

x = 0  # keep track of the x location
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # clear the screen each time
    screen.fill([255, 255, 255])

    # draw the circle (notice the x variable wrapped in int())
    pygame.draw.circle(screen, [255, 0, 255], [int(50 + x), 50], 50, 0)

    # adjust higher or lower for faster animations
    x += 0.1

    # flip the display
    pygame.display.flip()

Теперь анимация происходит синхронно с основным циклом,Помните, что пиксели на экране считаются целыми числами, поэтому любые операции с плавающей точкой (например, x += 0.1) должны быть int при отображении на экране.

Если вы не хотитедля работы с числами с плавающей точкой и десятичными числами минимальная скорость будет установлена ​​на 1, но настраивайте ее только через каждое определенное количество кадров

x = 0  # keep track of the x location
frames = 0  # keep track of frames
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # clear the screen each time
    screen.fill([255, 255, 255])

    # draw the circle (notice no int() function here)
    pygame.draw.circle(screen, [255, 0, 255], [50 + x, 50], 50, 0)

    # every 50 frames, increase movement. adjust higher or lower for varying speeds
    if frames % 50 == 0:
        x += 1  # never going to be a float, minimum of 1
    frames += 1

    # flip the display
    pygame.display.flip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...