如何让Pygame在for循环中的每个循环之前等待几毫秒,而不停止其他内容?

2024-09-25 00:36:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Pygame中有一个for循环,它试图在字符串中缓慢前进,就像RPG中文本滚动一样。我希望它在显示字符串中的下一个字符之前等待7毫秒左右,但我不知道如何让循环在不停止其他内容的情况下等待那么长的时间。 请注意,一般来说,我对pygame和python非常陌生。 这是我的密码:

mainText = pygame.font.Font(mainFont, 40)
finalMessage = ""

for letter in msg:
    finalMessage = finalMessage + letter
    renderMainText = mainText.render(finalMessage, True, white)
    screen.blit(renderMainText, (100, 100))
renderMainText = mainText.render(finalMessage, True, white)

我需要穿线吗?Asyncrio


Tags: 字符串文本true内容forrender字符pygame
2条回答

您根本不需要for循环。您有一个应用程序循环,所以请使用它。^{}可以检索自pygame.init()以来的毫秒数。见^{}模块

next_letter_time = 0
next_letter = 0

run = True
while run:
    current_time = pygame.time.get_ticks()

    # [...]

    if next_letter < len(msg):
        if current_time > next_letter_time:
            next_letter_time = current_time + 7000 # 7000 milliseconds = 7 
            finalMessage = finalMessage + msg[next_letter]
            next_letter += 1
            renderMainText = mainText.render(finalMessage, True, white)

最简单的例子:

import pygame

pygame.init()
window = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()

white = (255, 255, 255)
mainText = pygame.font.SysFont(None, 50)
renderMainText = None
finalMessage = ""
msg = "test text"
next_letter_time = 0
next_letter = 0

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    current_time = pygame.time.get_ticks()
    if next_letter < len(msg):
        if current_time > next_letter_time:
            next_letter_time = current_time + 500
            finalMessage = finalMessage + msg[next_letter]
            next_letter += 1
            renderMainText = mainText.render(finalMessage, True, white)

    window.fill(0)
    if renderMainText:
        window.blit(renderMainText, (100, 100))
    pygame.display.flip()

用这个

@coroutine
def my_func():
    from time import sleep
    mainText = pygame.font.Font(mainFont, 40)
    finalMessage = ""
    
    for letter in msg:
        finalMessage = finalMessage + letter
        renderMainText = mainText.render(finalMessage, True, white)
        screen.blit(renderMainText, (100, 100))
        yield from sleep(0.007)
    renderMainText = mainText.render(finalMessage, True, white)

async(my_func)

根据Python3.4,从中获得收益 有关更多不同的版本,请检查https://docs.python.org/3/async(my_func)之后,您的函数将独立运行,而不会中断其他任务

相关问题 更多 >