Pygame使用time.sleep等待x秒不执行它上面的代码

时间:2017-12-02 03:12:40

标签: python python-3.x pygame

我正在尝试在pygame中重新创建Pong,并尝试根据谁的分数将网的颜色更改为红色或绿色。我可以在有人得分后保持红色或绿色,直到不同的人得分,但是,我想在3秒后将网颜色改回黑色。我尝试使用time.sleep(3),但每当我这样做时,网络将保持黑色。 `

  elif pong.hitedge_right:     
       game_net.color = (255,0,0)     
       time.sleep(3)       
       scoreboard.sc1 +=1
       print(scoreboard.sc1)
       pong.centerx = int(screensize[0] * 0.5)
       pong.centery = int(screensize[1] * 0.5)

       scoreboard.text = scoreboard.font.render('{0}      {1}'.formatscoreboard.sc1,scoreboard.sc2), True, (255, 255, 255))

       pong.direction = [random.choice(directions),random.choice(directions2)]
       pong.speedx = 2
       pong.speedy = 3

       pong.hitedge_right = False
       running+=1
       game_net.color=(0,0,0)

理想情况下,它应该变为红色3秒,然后更新记分牌并重新开始球,相反,整个事情暂停并且直接跳过将网颜色改为黑色。我相信有更好的方法可以做到这一点,或者我正在使用time.sleep完全错误,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

您无法在PyGame(或任何GUI框架)中使用sleep(),因为它会停止更新其他元素的mainloop

您必须记住变量中的当前时间,然后在循环中将其与当前时间进行比较,以查看是否还剩3秒。或者您必须创建自己的EVENT,将在3秒后触发 - 您必须在for event中检查此事件。

可能需要对代码进行更多更改,以便我只能显示它的外观

使用时间/刻度

# create before mainloop with default value 
update_later = None


elif pong.hitedge_right:     
   game_net.color = (255,0,0)     
   update_later = pygame.time.get_ticks() + 3000 # 3000ms = 3s


# somewhere in loop
if update_later is not None and pygame.time.get_ticks() >= update_later:
   # turn it off
   update_later = None

   scoreboard.sc1 +=1
   print(scoreboard.sc1)
   # ... rest ...

使用活动

# create before mainloop with default value 
UPDATE_LATER = pygame.USEREVENT + 1

elif pong.hitedge_right:     
   game_net.color = (255,0,0)     
   pygame.time.set_timer(UPDATE_LATER, 3000) # 3000ms = 3s

# inside `for `event` loop
if event.type == UPDATE_LATER:
   # turn it off
   pygame.time.set_timer(UPDATE_LATER, 0)

   scoreboard.sc1 +=1
   print(scoreboard.sc1)
   # ... rest ...