2015-07-13 95 views
2

我会创建一种“滚动对话”,就像在旧的点,然后单击。 我会尽力解释一下:pygame滚动对话文本

我有以下文本:“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]的错误。

我该如何解决问题?

回答

2

在这里,你渲染整个文本到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是表面,而不是一个字符串了,这样你就可以不要将它索引为一个字符串,并希望获得文本的一部分。名为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() 

enter image description here

+0

谢谢! :) – Vito

1

在你给的例子,“文本”是一个表面(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) 
+0

谢谢你呢!完美的例子 – Vito