2012-05-31 2 views
3

В игровом клиенте MMO мне нужно создать цикл, который будет цикл 30 раз в 30 секунд (1 раз в секунду). К моему большому разочарованию я обнаружил, что я не могу использовать time.sleep() внутри цикла, потому что это заставляет замораживание игры во время цикла.Задержка цикла Python без time.sleep()

Сам цикл довольно прост, и единственная трудность заключается в том, как его задержать.

limit = 31 
while limit > 0 : 
    print "%s seconds remaining" % (limit) 
    limit = limit -1 

питон ЛИЭС существуют в клиенте как .pyc файлы в отдельную папку, и я надеюсь, что я могу избежать баловаться с ними. Считаете ли вы, что есть какой-либо способ выполнить эту задержку или это тупик?

+0

многопоточность является вашим другом. –

+1

Трудно предложить решение, когда единственное, что мы знаем о вашей игре, это «это петли» ... –

ответ

4

В вашей игре есть основной цикл. (Да, это так.)

Каждый раз, когда вы переходите к проверке состояния, перемещаете игроков, перерисовываете экран и т. Д., Вы проверяете время, оставшееся на вашем таймере. Если прошло не менее 1 секунды, вы распечатаете оставшиеся «секунды». Если прошло не менее 30 секунд, вы запускаете все ваши действия.

+0

Вот и все, я нашел основную петлю, и все было легко после этого. Существование этого цикла было всем, что мне нужно было знать, очень сильно. – mortaZa

-1

Предположив, что время выполнения, что внутри цикла составляет менее 1 секунды:

limit = 0 
while limit < 30 : 
    time_a = time.time() 
    """ Your code here """ 
    time_spent = time.time() - time_a 
    if time_spent < 1: 
     time.sleep(1 - time_spent) 
    print "%s seconds remaining" % (limit) 
    limit = limit -1 

Это сделает ваш цикл итерации время, равное 1 секунде.

+0

time.sleep() заставляет игру замораживаться во время ее выполнения. Это очень простая идея, но большая проблема для игры. – mortaZa

+0

вы не сказали, что он не должен быть блокируемым :(тогда используйте временные события, как кто-то сказал здесь – AlbertFerras

1

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

я предложил бы когда-нибудь, как это, но потоковая правильный способ сделать это ...

import time 

counter = 31 
start = time.time() 
while True: 
    ### Do other stuff, it won't be blocked 
    time.sleep(0.1) 
    print "looping..." 

    ### When 1 sec or more has elapsed... 
    if time.time() - start > 1: 
     start = time.time() 
     counter = counter - 1 

     ### This will be updated once per second 
     print "%s seconds remaining" % counter 

     ### Countdown finished, ending loop 
     if counter <= 0: 
      break 

или даже ...

import time 

max = 31 
start = time.time() 
while True: 
    ### Do other stuff, it won't be blocked 
    time.sleep(0.1) 
    print "looping..." 

    ### This will be updated every loop 
    remaining = max + start - time.time() 
    print "%s seconds remaining" % int(remaining) 

    ### Countdown finished, ending loop 
    if remaining <= 0: 
     break 
+0

Имейте в виду, это просто пример, и я положил этот 'time.sleep (0.1)', чтобы сделать отметку " 10 раз в секунду, чтобы избежать заполнения экрана сотнями линий «looping ...», они работают с примерами, копируют + вставляют и пробовали их. – KurzedMetal

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