我会创建一种类似于旧式点击的“滚动对话”。 我会尝试更好地解释:
我有以下文本:“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,不再是字符串,所以你不能像字符串一样索引它,希望得到一部分文本。名为 text 的 Surface 不知道它是否包含文本。
此外,您必须使用某种计时器来每秒更改文本。
这是一个简单的例子,说明如何做你想做的事:
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()




