【问题标题】:Countdown timer in PygamePygame中的倒数计时器
【发布时间】:2015-08-23 14:23:19
【问题描述】:

我开始使用 pygame,我想做简单的游戏。我需要的元素之一是倒数计时器。 如何在 PyGame 中进行倒计时(例如 10 秒)?

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    另一个简单的方法是简单地使用 pygame 的事件系统。

    这是一个简单的例子:

    import pygame
    pygame.init()
    screen = pygame.display.set_mode((128, 128))
    clock = pygame.time.Clock()
    
    counter, text = 10, '10'.rjust(3)
    pygame.time.set_timer(pygame.USEREVENT, 1000)
    font = pygame.font.SysFont('Consolas', 30)
    
    run = True
    while run:
        for e in pygame.event.get():
            if e.type == pygame.USEREVENT: 
                counter -= 1
                text = str(counter).rjust(3) if counter > 0 else 'boom!'
            if e.type == pygame.QUIT: 
                run = False
    
        screen.fill((255, 255, 255))
        screen.blit(font.render(text, True, (0, 0, 0)), (32, 48))
        pygame.display.flip()
        clock.tick(60)
    

    【讨论】:

    • 嗯。我想知道是否可以把它放在一个函数中。
    【解决方案2】:

    在此页面上,您将找到您要查找的内容http://www.pygame.org/docs/ref/time.html#pygame.time.get_ticks
    您在开始倒计时之前下载一次刻度(这可能是游戏中的触发器 - 关键事件,无论如何)。 例如:

    start_ticks=pygame.time.get_ticks() #starter tick
    while mainloop: # mainloop
        seconds=(pygame.time.get_ticks()-start_ticks)/1000 #calculate how many seconds
        if seconds>10: # if more than 10 seconds close the game
            break
        print (seconds) #print how many seconds
    

    【讨论】:

      【解决方案3】:

      pygame.time.Clock.tick 返回自上次调用clock.tick 以来的时间(以毫秒为单位)(delta timedt),因此您可以使用它来增加或减少计时器变量。

      import pygame as pg
      
      
      def main():
          pg.init()
          screen = pg.display.set_mode((640, 480))
          font = pg.font.Font(None, 40)
          gray = pg.Color('gray19')
          blue = pg.Color('dodgerblue')
          # The clock is used to limit the frame rate
          # and returns the time since last tick.
          clock = pg.time.Clock()
          timer = 10  # Decrease this to count down.
          dt = 0  # Delta time (time since last tick).
      
          done = False
          while not done:
              for event in pg.event.get():
                  if event.type == pg.QUIT:
                      done = True
      
              timer -= dt
              if timer <= 0:
                  timer = 10  # Reset it to 10 or do something else.
      
              screen.fill(gray)
              txt = font.render(str(round(timer, 2)), True, blue)
              screen.blit(txt, (70, 70))
              pg.display.flip()
              dt = clock.tick(30) / 1000  # / 1000 to convert to seconds.
      
      
      if __name__ == '__main__':
          main()
          pg.quit()
      

      【讨论】:

        【解决方案4】:

        在 pygame 中存在一个计时器事件。使用pygame.time.set_timer() 重复创建USEREVENT。例如:

        timer_interval = 500 # 0.5 seconds
        timer_event = pygame.USEREVENT + 1
        pygame.time.set_timer(timer_event , timer_interval)
        

        注意,在 pygame 中可以定义客户事件。每个事件都需要一个唯一的 ID。用户事件的 ID 必须介于 pygame.USEREVENT (24) 和 pygame.NUMEVENTS (32) 之间。在这种情况下,pygame.USEREVENT+1 是计时器事件的事件 ID。
        要禁用事件的计时器,请将毫秒参数设置为 0。

        在事件循环中接收事件:

        running = True
        while running:
        
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
        
                 elif event.type == timer_event:
                     # [...]
        

        可以通过将 0 传递给 time 参数来停止计时器事件。


        看例子:

        import pygame
        
        pygame.init()
        window = pygame.display.set_mode((200, 200))
        clock = pygame.time.Clock()
        font = pygame.font.SysFont(None, 100)
        counter = 10
        text = font.render(str(counter), True, (0, 128, 0))
        
        timer_event = pygame.USEREVENT+1
        pygame.time.set_timer(timer_event, 1000)
        
        run = True
        while run:
            clock.tick(60)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
                elif event.type == timer_event:
                    counter -= 1
                    text = font.render(str(counter), True, (0, 128, 0))
                    if counter == 0:
                        pygame.time.set_timer(timer_event, 0)                
        
            window.fill((255, 255, 255))
            text_rect = text.get_rect(center = window.get_rect().center)
            window.blit(text, text_rect)
            pygame.display.flip()
        

        【讨论】:

          【解决方案5】:

          有几种方法可以做到这一点 - 这是一种。据我所知,Python 没有中断机制。

          import time, datetime
          
          timer_stop = datetime.datetime.utcnow() +datetime.timedelta(seconds=10)
          while True:
              if datetime.datetime.utcnow() > timer_stop:
                  print "timer complete"
                  break
          

          【讨论】:

            【解决方案6】:

            有很多方法可以做到这一点,这是其中之一

            import pygame,time, sys
            from pygame.locals import*
            pygame.init()
            screen_size = (400,400)
            screen = pygame.display.set_mode(screen_size)
            pygame.display.set_caption("timer")
            time_left = 90 #duration of the timer in seconds
            crashed  = False
            font = pygame.font.SysFont("Somic Sans MS", 30)
            color = (255, 255, 255)
            
            while not crashed:
                for event in pygame.event.get():
                    if event.type == QUIT:
                        crashed = True
                total_mins = time_left//60 # minutes left
                total_sec = time_left-(60*(total_mins)) #seconds left
                time_left -= 1
                if time_left > -1:
                    text = font.render(("Time left: "+str(total_mins)+":"+str(total_sec)), True, color)
                    screen.blit(text, (200, 200))
                    pygame.display.flip()
                    screen.fill((20,20,20))
                    time.sleep(1)#making the time interval of the loop 1sec
                else:
                    text = font.render("Time Over!!", True, color)
                    screen.blit(text, (200, 200))
                    pygame.display.flip()
                    screen.fill((20,20,20))
            
            
            
            
            pygame.quit()
            sys.exit()
            

            【讨论】:

              【解决方案7】:

              这其实很简单。感谢 Pygame 创建了一个简单的库!

              import pygame
              x=0
              while x < 10:
                  x+=1
                  pygame.time.delay(1000)
              

              这就是它的全部内容!玩得开心!

              【讨论】:

              • 延迟不适用于某些场景,因为它不会延迟特定对象而是延迟整个游戏。
              猜你喜欢
              • 2013-08-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-03-06
              • 1970-01-01
              • 2012-11-08
              相关资源
              最近更新 更多