如何在pygame中一个字母接一个字母地快速发送文本?(就像那些复古的RPG游戏)



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

def npc_one_dialogue():
P = font.render('P', True, black)
r = font.render('r', True, black)
o = font.render('o', True, black)
f = font.render('f', True, black)
e = font.render('e', True, black)
s = font.render('s', True, black)
scr.blit(P, (110, 420))
time.sleep(0.2)
scr.blit(r, (140, 420))
time.sleep(0.2)
scr.blit(o, (170, 420))
time.sleep(0.2)
scr.blit(f, (200, 420))
time.sleep(0.2)
scr.blit(e, (230, 420))
time.sleep(0.2)
scr.blit(s, (260, 420))
time.sleep(0.2)
scr.blit(s, (290, 420))
time.sleep(0.2)
scr.blit(o, (320, 420))
time.sleep(0.2)
scr.blit(r, (350, 420))

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

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

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列表中与第一个字母有关的第一个位置,与第二个字母相关的第二个位置等等,所以很容易像这样循环和闪电攻击它们:

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_one_dialogue函数更改为:

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]))

相关内容

最新更新