Python 如何在pygame中逐字发送文本?(就像那些复古RPG游戏)

Python 如何在pygame中逐字发送文本?(就像那些复古RPG游戏),python,time,pygame,Python,Time,Pygame,我设置了与NPC的冲突,这样当玩家靠近NPC时会出现一个对话,但我决定改变它,因为如果文本逐字呈现,它会看起来更复古。我尝试“blit”每个字母,并在每个字母之间添加时间。sleep(1),但在执行时,这大大降低了游戏的速度。还有别的办法吗?我已经从我的代码中附加了对话功能,并且我的整个代码都是链接的 所以我们需要一个计时器。但在此之前,手动渲染每个字母的方式非常繁琐。我们可以把它放在一个循环中,这样每次迭代我们都会呈现一个字母 一种方法是为每个字母生成单独的文本表面,并将它们存储在表面列表中。

我设置了与NPC的冲突,这样当玩家靠近NPC时会出现一个对话,但我决定改变它,因为如果文本逐字呈现,它会看起来更复古。我尝试“blit”每个字母,并在每个字母之间添加
时间。sleep(1)
,但在执行时,这大大降低了游戏的速度。还有别的办法吗?我已经从我的代码中附加了对话功能,并且我的整个代码都是链接的


所以我们需要一个计时器。但在此之前,手动渲染每个字母的方式非常繁琐。我们可以把它放在一个循环中,这样每次迭代我们都会呈现一个字母

一种方法是为每个字母生成单独的文本表面,并将它们存储在
表面
列表中。在那之后,我们需要知道我们想把每封信放在哪里。我们可以遍历曲面,并相应地将位置添加到
位置
列表中

FONT = pygame.font.Font(pygame.font.get_default_font(), 20)
previousWidth = 0
def getSurfaces(word, pos):
    global previousWidth
    
    surfaces = []
    positions  = []
    for i in range(len(word)):
        surf = FONT.render(f"{word[i]}", True, black)
        surfaces.append(surf)
    for i in range(len(surfaces)):
        previousWidth += surfaces[i-1].get_rect().width
        positions.append([previousWidth + pos[0], pos[1]])
    return surfaces, positions
函数返回单词中每个字母的表面和位置。
positions
列表中的第一个位置与第一个字母相关,第二个位置与第二个字母相关,因此很容易循环并按如下方式进行blit:

    for i in range(len(surfaces)):
        src.blit(surfaces[i], (positions[i][0], positions[i][1]))
工作示例:

import time
import pygame
pygame.init()

D = pygame.display.set_mode((500, 300))
FONT = pygame.font.Font(pygame.font.get_default_font(), 20)

black = (0, 0, 0)
word = "profes"
   
previousWidth = 0
def getSurfaces(word, pos):
    global previousWidth
    
    surfaces = []
    positions  = []
    for i in range(len(word)):
        surf = FONT.render(f"{word[i]}", True, black)
        surfaces.append(surf)
    for i in range(len(surfaces)):
        previousWidth += surfaces[i-1].get_rect().width
        positions.append([previousWidth + pos[0], pos[1]])
    return surfaces, positions

surfaces, positions = getSurfaces(word, [100, 150])

def npc_one_dialogue():
    for i in range(len(surfaces)):
        D.blit(surfaces[i], (positions[i][0], positions[i][1])) 

while True:
    pygame.event.get()
    D.fill((255, 255, 255))

    npc_one_dialogue()

    pygame.display.flip()
现在我们有了一种单独渲染每个字母的方法,问题就变成了在渲染每个字母之间添加延迟,这可以使用
time.time
完成。因此,我们可以将
npc\u one\u对话
功能更改为:

start = time.time()
count = 0
def npc_one_dialogue(delay=0.3):
    global count
    global start
    now = time.time()
    if count < len(surfaces):
        if now - start > delay:
            count += 1
            start = now
    for i in range(count):
        D.blit(surfaces[i], (positions[i][0], positions[i][1]))
start=time.time()
计数=0
def npc_one_对话(延迟=0.3):
全局计数
全球启动
now=time.time()
如果计数延迟:
计数+=1
开始=现在
对于范围内的i(计数):
D.blit(曲面[i],(位置[i][0],位置[i][1]))

您可以将它的睡眠时间减少到0.2秒左右。。。它会影响整个游戏,还是仅仅影响对话?如果问题仍然存在,请尝试上载代码,因为可能还有其他问题problem@Shufi123保持睡眠值为1或0.2,无论哪种方式,它都会减慢速度,甚至无法达到预期效果,整个游戏都会减慢,甚至关键事件的执行速度都不够快,它们的执行时间晚了5秒,甚至还没有完全完成。对于代码,我会立即编辑它并添加对话功能部分,然后在整个代码中添加GitHub链接thing@pythonnewbie欢迎光临。另外,当我将代码从空闲复制到这里时,我设法删除了一行代码,因此最小的“工作”示例不起作用。不过我现在改了,所以它确实有效。
start = time.time()
count = 0
def npc_one_dialogue(delay=0.3):
    global count
    global start
    now = time.time()
    if count < len(surfaces):
        if now - start > delay:
            count += 1
            start = now
    for i in range(count):
        D.blit(surfaces[i], (positions[i][0], positions[i][1]))