【问题标题】:pygame scrolling dialogue textpygame 滚动对话文本
【发布时间】:2015-07-13 10:39:44
【问题描述】:

我会创建一种“滚动对话”,就像在旧的点击中一样。 我会尽力解释得更好:

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

但它给了我关于 text[i] 的错误。

我该如何解决这个问题?

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    在这里,您将整个文本渲染到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()
    

    【讨论】:

      【解决方案2】:

      在您提供的示例中,“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)
      

      【讨论】:

        猜你喜欢
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多