pygame 滚动对话文本

pygame scrolling dialogue text

我会像以前那样创建一种 "scrolling dialogue" 并单击。 我会尽力解释得更好:

我有以下文字:"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()

在您提供的示例中,'text' 是一个表面(font.render 根据您提供的字符串呈现表面)。你想要做的是遍历一个字符串,然后将它渲染到一个表面上。

我要更改的另一件事是“(400+i, 300)”,因为字母的宽度超过一个像素,因此仅将坐标移动一个像素会使它们重叠。我建议使用 font.size 函数来确定新坐标。

示例:

clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 48)
string = "A long time ago"
windowSurface.fill(BLACK)
for i in range(len(string)):
    text = font.render(string[i], True, (0, 128, 0))
    windowSurface.blit(text,(400 + (font.size(string[:i])[0]), 300))
    pygame.display.update()
    clock.tick(2)