微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何在pygame中逐个字母逐个显示文本? 例如在那些复古的RPG游戏中

如何解决我如何在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 举报,一经查实,本站将立刻删除。