【问题标题】:Pygame Text Blit and time.sleep not workingPygame Text Blit 和 time.sleep 不起作用
【发布时间】:2017-07-21 21:24:53
【问题描述】:

我很难使用pygame 将文本传送到屏幕上。现在在退出之前我只想让一条消息显示2秒钟,然后退出游戏。为此,我使用time.sleep(2)。但是,我相信大多数其他人都没有从我在 Stackoverflow 上查找的问题中遇到这个问题,文本直到窗口关闭前的最后一刻才出现。相反,按下关闭按钮后屏幕保持白色。我的代码如下。请注意,这不是this question 的重复。

import pygame
import time

pygame.init()

white = (255,255,255)
black = (0,0,0)
red = (255,0,0)

display_width = 800
display_height  = 600
gameDisplay = pygame.display.set_mode((display_width,display_height))
clock = pygame.time.Clock()

FPS = 30

font = pygame.font.SysFont(None, 25)

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

    gameDisplay.fill(white)    
    pygame.display.update()
    clock.tick(FPS)

screen_text = font.render('Test', True, red)
gameDisplay.blit(screen_text, (0, 0))
pygame.display.update()
time.sleep(2)
pygame.quit()

【问题讨论】:

  • 没有 time.sleep 是否可以工作?
  • @whackamadoodle3000 它只是立即退出,所以我不确定 time.sleep 是否是问题,但它似乎在 time.sleep 之后调用update() 暗示了一些奇怪的异步。 .. 很困惑。
  • 这实际上看起来是一个相当棘手的问题!有趣的是,您的代码在我的 Windows 10 和 python 2/3 计算机上“有效”。然而,time.sleep(n) 不是最优的,因为当调用sleep 函数时,python 程序本质上是“冻结”的,因此 pygame 窗口将冻结。通过使用pygame.time.set_timer() 在 x 毫秒后触发自定义 pygame userevent 来解决该问题也不能很好地工作,因为当应用程序窗口被拖动时所有 pygame 事件都会冻结!

标签: python pygame


【解决方案1】:

我最终使用了@CodeSurgeon 提到的pygame.time.set_timer 解决方法。

这对我有用 - 将 time.sleep(2) 替换为:

pygame.time.set_timer(pygame.USEREVENT, 2000)

should_quit = False

while not should_quit:
    for event in pygame.event.get():
        if event.type == pygame.USEREVENT:
            should_quit = True

【讨论】:

    【解决方案2】:

    我实际上有完全相同的问题,发现如果我在 pygame.quit() 之后直接移动 time.sleep(2),它会按预期工作。我是 pygame 新手,不知道为什么会这样

    screen_text = font.render('Test', True, red)
    gameDisplay.blit(screen_text, (0, 0))
    pygame.display.update()
    
    pygame.quit()
    time.sleep(2)
    

    【讨论】:

      【解决方案3】:

      您可以尝试将time.sleep(2) 替换为

      for i in range(0, 200, 1):
          time.sleep(0.01)
      

      如果您希望能够使用 CTRL-C 停止程序,这在其他需要长时间睡眠的情况下很有用。使用函数也可能更方便:

      def MySleep(duration, resolution=10):
          """Sleep, without freezing the program. All values in ms"""
          for i in range(0, int(duration), int(resolution)):
              time.sleep(resolution / 1000)
      

      【讨论】:

        【解决方案4】:

        由于某种原因,stdlib time.sleep() 在 pygame 中不起作用。 但是,pygame 确实有自己的时间函数。 这是我编写的用于逐字符打印消息的代码。

        message = ""
        font = pygame.font.Font("freesansbold.ttf", 32)
        message_text_x = 0
        message_text_y = 550
        message_text_speed = 35
        inF = open("chapter_1.txt")
        lines = inF.readlines()
        
        def write_message(char, x, y):
            # first render the value as text so it can be drawn on the screen using screen.blit
            message_text = font.render(char, True, (0, 0, 0))
            screen.blit(message_text, (x, y))
        
        running = True
        while running:
            for line in lines:
                for char in line:
                    for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                            running = False
                        if event.type == pygame.KEYDOWN:
                            if event.key == pygame.K_q:
                                running = False
                            if event.key == pygame.K_SPACE:
                                message_text_speed = 10
        
                    message += char
                    write_message(message, message_text_x, message_text_y)
                    pygame.event.pump()
                    pygame.time.delay(message_text_speed)
                    pygame.display.update()
                    clock.tick(60)
        

        当空格键被点击时,文本的速度变得更快

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-04
          • 2020-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-04
          • 1970-01-01
          相关资源
          最近更新 更多