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,不再是字符串,所以不能像字符串一样索引它,希望得到一部分文字。名为 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()
在您提供的示例中,'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)
我会像以前那样创建一种 "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,不再是字符串,所以不能像字符串一样索引它,希望得到一部分文字。名为 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()
在您提供的示例中,'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)