如何解决我如何在pygame中逐个字母逐个显示文本? 例如在那些复古的RPG游戏中
我设置了与NPC的碰撞,以便当玩家靠近NPC时出现一个对话框,但是我决定更改它,因为如果逐个字母地显示文本,它将看起来更加复古,我尝试将每个文本“都涂成”字母并在每个字母之间添加Private Sub FilterButton_Click()
Me.someListBox.RowSource = "SELECT * FROM SoMetable WHERE SomeField = '" & Replace(Me.txtSomeTextBox,"'","''") & "' AND read_permission = 1"
End Sub
,但在执行游戏时,这会使游戏速度大大降低。还有其他方法吗?我已经从代码中附加了对话功能,并且我的整个代码都已链接到here。
time.sleep(1)
解决方法
所以我们需要一个计时器。但在此之前,手动呈现每个字母的方式非常繁琐。我们可以将其循环放置,以便每次迭代都呈现一个字母。
一种方法是为每个字母生成单独的文本表面并将它们存储在surfaces
列表中。在那之后,我们需要知道我们要在每个字母上加上blit的位置。我们可以遍历曲面并相应地向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)
word = "profes"
previousWidth = 0
def getSurfaces(word,positions
surfaces,positions = getSurfaces(word,[100,150])
def npc_one_dialogue():
for i in range(len(surfaces)):
D.blit(surfaces[i],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][1]))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。