2013-08-02 3 views
2

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

Вопрос: как поставить таймер в свой код?

Нужно обращать внимание, и когда оно достигает 00:00, вы можете увидеть текст: GAME OVER и завершить игру. Если это помогает, я помещаю в основную строку своего кода. Если вам нужно больше кода, например, классов и т. Д., Я рад опубликовать его.

while done == False: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 

      #This makes the player move 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       player.changespeed(-6,0) 
      if event.key == pygame.K_RIGHT: 
       player.changespeed(6,0) 
      if event.key == pygame.K_UP: 
       player.changespeed(0,-6) 
      if event.key == pygame.K_DOWN: 
       player.changespeed(0,6) 

     #This stops the player from moving 
     if event.type == pygame.KEYUP: 
      if event.key == pygame.K_LEFT: 
       player.changespeed(6,0) 
      if event.key == pygame.K_RIGHT: 
       player.changespeed(-6,0) 
      if event.key == pygame.K_UP: 
       player.changespeed(0,6) 
      if event.key == pygame.K_DOWN: 
       player.changespeed(0,-6) 

    player.updateWall(wall_list) 

    window.fill(black) 

    movingsprt.draw(window) 
    wall_list.draw(window) 

    pygame.display.flip() 

    clock.tick(40) 

pygame.quit()    

ответ

1

Вы можете создать событие через некоторое время. См.: http://www.pygame.org/docs/ref/time.html#pygame.time.set_timer

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

2

Как и Ганс, тогда вы можете использовать метод pygame.time.set_timer() для вызова функции по прошествии определенного количества времени. Но с точки зрения того, сколько времени прошло, вам, вероятно, лучше использовать другой метод.

Используя метод pygame.time.Clock.tick_busy_loop, вы можете контролировать, сколько FPS ваша игра работает на и отслеживать, сколько времени прошло, так как она возвращает сколько millisecons прошло с момента последнего вызова:

clock = pygame.time.Clock() 
minutes = 0 
seconds = 0 
milliseconds = 0 

while True: #game loop 
    #do stuff here 
    if milliseconds > 1000: 
     seconds += 1 
     milliseconds -= 1000 
    if seconds > 60: 
     minutes += 1 
     seconds -= 60 

    print ("{}:{}".format(minutes, seconds)) 

    milliseconds += clock.tick_busy_loop(60) #returns the time since the last time we called the function, and limits the frame rate to 60FPS 
1

Вы могли бы сделать это

time = 100 #time in seconds 
pygame.time.set_timer(USEREVENT+1, 1000)#1 second is 1000 milliseconds 

#everything below this line should be in your main loop 
for event in pygame.event.get(): 
    if event.type = USEREVENT+1: 
     time -= 1 

if time == 0: 
    print "GAME OVER" 
0

Я не уверен, если вы нашли ответ на свой вопрос или, если на то пошло, если это будет полезно ... Я тоже работаю над добавлением таймера в игре, но у меня есть некоторые вопросы ... для начала, у меня есть успех со следующим кодом. (Я получил это с другой доски объявлений, но я не могу найти его снова, поэтому я приношу свои извинения за то, что не дал кредит в это время - я отредактирую этот пост, когда найду сайт).

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

я не имел большого успеха с таймером и клещами (по какой-то причине, казалось, что моя программа работала бесконечный цикл ... так или иначе:

Это то, что я использую:

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

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