IT干货网

python之pygame滚动对话文本

wuhuacong 2025年05月04日 编程设计 374 0

我会创建一种类似于旧式点击的“滚动对话”。 我会尝试更好地解释:

我有以下文本:“Hello World”。 我会在屏幕上一个字母一个字母地打印:“H”(1 秒后)“e”(1 秒后)“l”等。

我试过这样做:

font = pygame.font.Font("orangekid.ttf", 25) 
text = font.render("A long time ago", True, (0, 128, 0)) 
 
 
        pygame.display.update() 
        for i in range(len("A long time ago")): 
            display_game.fill(BLACK) 
            display_game.blit(text[i],(400+i, 300)) 
 
            clock.tick(60) 

但它给了我一个关于文本 [i] 的错误。

我该如何解决这个问题?

请您参考如下方法:

在这里,您将整个文本渲染到 Surface:

text = font.render("A long time ago", True, (0, 128, 0)) 

在这里,您迭代一个字符串:

for i in range(len("A long time ago")): 
    display_game.fill(BLACK) 
    display_game.blit(text[i],(400+i, 300)) 

text 是一个Surface,不再是字符串,所以你不能像字符串一样索引它,希望得到一部分文本。名为 textSurface 不知道它是否包含文本。

此外,您必须使用某种计时器来每秒更改文本。

这是一个简单的例子,说明如何做你想做的事:

import pygame 
pygame.init() 
screen = pygame.display.set_mode((640, 480)) 
clock = pygame.time.Clock() 
 
font = pygame.font.Font(None, 25) 
 
# raise the USEREVENT every 1000ms 
pygame.time.set_timer(pygame.USEREVENT, 200) 
 
# generate a generator that scrolls through the letters 
# given a string foo, it will return 
# f 
# fo 
# foo 
def text_generator(text): 
    tmp = '' 
    for letter in text: 
        tmp += letter 
        # don't pause for spaces 
        if letter != ' ': 
            yield tmp 
 
# a simple class that uses the generator 
# and can tell if it is done 
class DynamicText(object): 
    def __init__(self, font, text, pos, autoreset=False): 
        self.done = False 
        self.font = font 
        self.text = text 
        self._gen = text_generator(self.text) 
        self.pos = pos 
        self.autoreset = autoreset 
        self.update() 
     
    def reset(self): 
        self._gen = text_generator(self.text) 
        self.done = False 
        self.update() 
         
    def update(self): 
        if not self.done: 
            try: self.rendered = self.font.render(next(self._gen), True, (0, 128, 0)) 
            except StopIteration:  
                self.done = True 
                if self.autoreset: self.reset() 
 
    def draw(self, screen): 
        screen.blit(self.rendered, self.pos) 
             
message = DynamicText(font, "A long time ago...", (200, 200), autoreset=True) 
while True: 
    for event in pygame.event.get(): 
        if event.type == pygame.QUIT: break 
        if event.type == pygame.USEREVENT: message.update() 
    else: 
        screen.fill(pygame.color.Color('black')) 
        message.draw(screen) 
        pygame.display.flip() 
        clock.tick(60) 
        continue 
    break 
pygame.quit() 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!