2016-05-23 2 views
2

Я делаю игру, где, когда игрок выходит за пределы экрана, начинается уровень. Я хочу показать изображение «УРОВЕНЬ 1» до начала игры, но программа слишком быстро показывает изображение. Моя частота кадров составляет 60.Замедление, но не программа

Мне интересно, есть ли способ задержать время в течение примерно 5 секунд во время блендинга экрана, но после того, как он возобновится до нормального темпа. Проблема для меня с pygame.time.delay() и ожидание - это замедляет работу всей программы.

Есть ли более простой способ?

EDIT______ КОД

#START OF LEVEL 1 
    if level1: 

     screen.blit(level1_image,background_position) 
     pygame.time.delay(500) 
     level1yay = True 
    if level1yay: 

     screen.blit(background,background_position) 

#Flip the Display 
    pygame.display.flip() 
    clock.tick(time) 

#Quit 
pygame.quit() 

Первое изображение не отображается, и идет прямо ко второму изображению

+0

Таким образом, вы действительно пытались показать изображение, а затем задержать программу в течение 5 секунд? –

+0

Я сделал, однако это не сработало, оно приостановило мою всю программу, и изображение почему-то никогда не проявлялось. – abc1234

+0

Не могли бы вы [изменить] ваш вопрос, чтобы показать [mcve]? –

ответ

1

Вы можете настроить таймер и отслеживать время. когда таймер достигает задержки, которую вы хотите, вы можете что-то сделать.

В приведенном ниже примере я настроил таймер, и я установил level1yay в true только после того, как таймер достиг значения задержки.

Я добавил условие canexit, чтобы игра не заканчивалась в первом цикле. Я предположил, что условие для «если уровень1:» было установлено где-то в другом месте.

mytimer = pygame.time.Clock() #creates timer 
time_count = 0 #will be used to keep track of the time 
mydelay = 5000 # will delay the main game by 5 seconds 
canexit = False 

#updates timer 
    mytimer.tick() 
    time_count += mytimer.get_time() 
#check if mydelay has been reached 
    if time_count >= mydelay: 
     level1yay = True 
     canexit = True 

#START OF LEVEL 1 
    if level1: 
     screen.blit(level1_image,background_position) 

    if level1yay: 
     screen.blit(background,background_position) 

#Flip the Display 
    pygame.display.flip() 
    clock.tick(time) 

#Quit 
if canexit == True: 
    pygame.quit() 

EDIT ВКЛЮЧИТЬ ДЕЙСТВИЯ Перед входом LEVEL1:

mytimer = pygame.time.Clock() #creates timer 
time_count = 0 #will be used to keep track of the time 
mydelay = 5000 # will delay the main game by 5 seconds 
canexit = False 
start_menu = True # to start with the start menu rather than level1 

#Do something before level 1 
    if start_menu == True: 
     ... do stuff 
     if start_menu end: 
      level1 = True 
      time_count = 0 

#START OF LEVEL 1 
    if level1 == True: 
    #updates timer 
     mytimer.tick() # start's ticking the timer 
     time_count += mytimer.get_time() # add's the time since the last tick to time_count 
    #check if mydelay has been reached 
     if time_count >= mydelay: 
      level1 = False # so that you do not enter level1 again (even though this is redundant here since you will exit the game at the end of the loop... see canexit comment) 
      level1yay = True # so that you can enter level1yay 
      canexit = True # so that the game terminates at the end of the game loop 
      screen.blit(level1_image,background_position) 

    if level1yay: 
     screen.blit(background,background_position) 

#Flip the Display 
    pygame.display.flip() 
    clock.tick(time) 

#Quit 
if canexit == True: 
    pygame.quit() 
+0

Только вопрос. Давайте просто скажем, что игрок должен что-то сделать, чтобы добраться до экрана 1 уровня. Не было бы тогда непредсказуемо, потому что вы не знаете, когда игрок войдет. Также мне нужно поставить все эти вышеперечисленные переменные до или после цикла. – abc1234

+0

Привет, я бы поставил переменные перед циклом, иначе они будут сбрасываться каждый раз, когда вызывается игровой цикл, а time_count никогда не достигнет значения mydelay, так как time_count будет сброшен на 0. I условия перехода на уровень 1 после ввода (скажем, у вас есть экран меню), тогда вы можете добавить условие, чтобы при выходе из этого экрана меню значение time_count сбрасывалось до 0. Поскольку mytimer.tick() получает время, прошедшее со времени последнего галочка он должен работать. – Sorade

+0

Я только что отредактировал свой ответ, чтобы дать вам представление ... Я не могу точно помнить, что делают галочка и get_time(), поэтому возможно, что при настройке time_count на 0 при выходе из «меню« Пуск »или что-то еще делается до уровня 1, даже не нужно. Дополнительную информацию см. В http://www.pygame.org/docs/ref/time.html.В моей игре, основанной на классе, я использую эти таймеры для множества вещей, например, позволяя игроку атаковать только раз в 1 секунду или затягивать анимацию спрайтов ... У меня еще не было никаких проблем с этим. – Sorade

0

Я не знаю, если это будет действительно работать, но вы можете попробовать отображать один и тот же образ «УРОВЕНЬ 1» несколько раз подряд, поэтому он, похоже, остается дольше, но сама программа никогда не задерживается.

+0

Я пробовал это, но со скоростью 60 кадров в секунду я не мог установить до 300 изображений в секунду. Это займет скорость, и это будет грязно. Я мог бы сделать цикл for, но есть определенно более простые способы. – abc1234

0

pygame.time.wait(5000) - это задержка в 5 секунд, 500 - половина секунды. Вы установили переменную level1 в значение True непосредственно перед этим фрагментом кода, не так ли?

+0

Да, я действительно устанавливаю его в true. Я пробовал это, и он все еще не работал, вся моя программа просто зависает. – abc1234

Смежные вопросы