Я не уверен, если вы нашли ответ на свой вопрос или, если на то пошло, если это будет полезно ... Я тоже работаю над добавлением таймера в игре, но у меня есть некоторые вопросы ... для начала, у меня есть успех со следующим кодом. (Я получил это с другой доски объявлений, но я не могу найти его снова, поэтому я приношу свои извинения за то, что не дал кредит в это время - я отредактирую этот пост, когда найду сайт).
Я взял этот код, который был написан для отображения счета в окне консоли и изменил его для отображения на экране.
я не имел большого успеха с таймером и клещами (по какой-то причине, казалось, что моя программа работала бесконечный цикл ... так или иначе:
Это то, что я использую:
import time
import threading
import pygame, sys
#among others....
#timer clock
global timerrun #I added this to show/hide the clock from my main screen
timerrun = 0 #just a default
class Timer (threading.Thread):
def __init__(self,seconds):
self.runTime = seconds
threading.Thread.__init__(self)
def run(self):
time.sleep(self.runTime)
class CountDownTimer(Timer):
def run(self):
counter = self.runTime
for sec in range(self.runTime):
global timerrun
timerrun = 1 #set timer is running global variable - tells main loop to display clock
global timedisp #set timedisplay as global var so it can be shared between threads
timedisp = clockfont.render(str(counter),1,(255,255,255))
#print str(counter)
time.sleep(1.0)
counter -= 1
class CountDownExec(CountDownTimer):
def __init__(self, seconds, action):
self.action = action
CountDownTimer.__init__(self, seconds)
def run (self):
CountDownTimer.run(self)
self.action()
def myAction():
#print "Perform an action here... say GAME OVER!"
global timedisp
timedisp = clockfont.render("GAME OVER",1,(255,255,255))
c = CountDownExec(timeonclock,myAction)
Некоторые оговорки: Во-первых, я не уверен на 100%, что все это делает ... по существу, первая часть настраивает функцию таймера. Вторая часть настраивает переменные таймера (счетчик и задержку ... на данный момент , Для простоты я использую 1-секундные приращения.)
Следующая часть (я думаю) говорит, что эта функция запускается внутри нового потока - поэтому он работает независимо от моего основного цикла в своем собственном темпе (то есть он не приостанавливает мою игру 1 секунду за раз)
Последняя часть - это то, что я хочу, когда часы достигнут нуля ... Я переустановил глобальную переменную timedisp, чтобы сказать «GAME OVER»
Кроме того, я понятия не имею, как налогообложение этого метода в системе , Я понятия не имею, является ли это «эффективным или нет». Мне бы хотелось, чтобы кто-то в этом поступил.
Перед этими функциями, я шрифт определяется как:
clockfont = pygame.font.SysFont("#FONT_NAME",SIZE) #font to use for timer clock
В моей основной цикл, я отображая результат с:
if timerrun == 1:
clockpos = (screenwidth - timedisp.get_width()) /2 #center my clock
screen.blit(timedisp,(clockpos,100)) #put it on screen
Опять же, я использую переменную timerrun, потому что Я хочу, чтобы часы (в моей игре) были дополнительными ... для тестирования часы не будут отображаться до тех пор, пока вы не нажмете клавишу «t» на клавиатуре. , который выполняет таймер в новой ветке:
if event.key==K_t:
c.start();
Затем он отображает часы, обратный отсчет, а затем показывает «ИГРА НА ПЕРЕД», когда закончите.
Вот мои вопросы, если кто-нибудь может помочь ...
Я не уверен, если проходя меняющийся текст с помощью глобальной переменной является «правильный» способ сделать это .. может кто-нибудь сказать мне, если/как может лучше всего обновить экран на экране, используя эти 2 потока.
Я хотел бы действие, которое происходит, когда время истекло (часть, которая отображает «Game Over» - для выполнения некоторых функций обратно в основном потоке (я говорю это право)
Например: Когда время истекает, в нем выполняется функция, которая сравнивает баллы 2 игроков и объявляет победителя. - Как я могу сделать «поток 2» (таймер) вызывать функцию обратно в «нить 1» (остальная часть игры)?
И наконец, я ищу способ «Сбросить» часы без сброса всей программы. Когда я снова нажимаю «t», я получаю сообщение об ошибке, что вы не можете запустить поток заново. предложение о том, как перезапустить мои часы?
Большое спасибо!
Jay