Задержка времени в python/pygame без нарушения игры?

Я писал код для введения в игру, которую я делал, здесь введение представляло собой серию изображений с временной задержкой в ​​4 секунды между ними. Проблема в том, что использование метода time.sleep также мешает основному циклу, и программа, таким образом, «зависает» на этот период. Любые предложения, пожалуйста? [Intro и TWD являются звуковыми объектами]

a=0
while True:
    for event in pygame.event.get():
        if event.type==QUIT:
            pygame.quit()
            sys.exit()
            Intro.stop()
            TWD.stop()
    if a<=3:
        screen.blit(pygame.image.load(images[a]).convert(),(0,0))
        a=a+1
        if a>1:
                time.sleep(4)
    Intro.play()
    if a==4:
            Intro.stop()
            TWD.play()

    pygame.display.update()

person Harbinger    schedule 27.10.2014    source источник
comment
sys.exit() выходит из программы. Код после него не запускается.   -  person jfs    schedule 28.10.2014


Ответы (2)


Вы можете добавить некоторую логику, которая будет продвигать a только в том случае, если прошло 4 секунды. Для этого вы можете использовать модуль времени и получить начальную точку last_time_ms Каждый раз, когда мы зацикливаемся, мы находим новое текущее время и находим разницу между этим временем и last_time_ms. Если оно больше 4000 мс, увеличьте a.

Я использовал миллисекунды, потому что обычно считаю их более удобными, чем секунды.

import time

a=0
last_time_ms = int(round(time.time() * 1000))
while True:
    diff_time_ms = int(round(time.time() * 1000)) - last_time_ms
    if(diff_time_ms >= 4000):
        a += 1
        last_time_ms = int(round(time.time() * 1000))
    for event in pygame.event.get():
        if event.type==QUIT:
            pygame.quit()
            sys.exit()
            Intro.stop()
            TWD.stop()
    if a <= 3:
        screen.blit(pygame.image.load(images[a]).convert(),(0,0))
        Intro.play()
    if a == 4:
        Intro.stop()
        TWD.play()

    pygame.display.update()
person flakes    schedule 27.10.2014

Не используйте ни time.sleep(), ни time.time() с pygame. Вместо этого используйте функции pygame.time:

FPS = 30 # number of frames per second
INTRO_DURATION = 4 # how long to play intro in seconds
TICK = USEREVENT + 1 # event type
pygame.time.set_timer(TICK, 1000) # fire the event (tick) every second
clock = pygame.time.Clock()
time_in_seconds = 0
while True: # for each frame
    for event in pygame.event.get():
        if event.type == QUIT:
            Intro.stop()
            TWD.stop()
            pygame.quit()
            sys.exit()
        elif event.type == TICK:
            time_in_seconds += 1

    if time_in_seconds < INTRO_DURATION:
        screen.blit(pygame.image.load(images[time_in_seconds]).convert(),(0,0))
        Intro.play()
    elif time_in_seconds == INTRO_DURATION:
        Intro.stop()
        TWD.play()

    pygame.display.flip()
    clock.tick(FPS)

Используйте pygame.time.get_ticks(), если вам нужна более точная временная гранулярность, чем одна секунда.

person jfs    schedule 28.10.2014