我正在尝试在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完全错误,但我不知道如何解决这个问题。
答案 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 ...