如何延迟从列表中迭代 blits

How to delay blits being iterated from a list

我正在尝试为被 blit 的文本创建打字机效果。所谓打字机效应,我的意思是我试图避免整个文本同时出现在屏幕上。相反,我试图让每个字母单独出现,在字符串中的下一个字符出现之前稍有延迟。

问题是我没有使用 pygame 的 font.render。相反,我制作了自己的自定义字体,每个字母都保存为一个单独的图像文件。现在每个字母数字字符都有自己的变量,它的图像附加到该变量并且每个都附加到列表中。

例如:

    letter_IMGs = []
    a = "a" == pygame.image.load("IMG/letter_a.gif)
    letter_IMG.append(a)

楼下,我有一些类似的东西:

    letter_pos_x = 0
    text = "Hello"
    for i, c in enumerate(text):
        screen.blit(letter_IMGs[i], (letter_pos_x,0))
        letter_pos_x += 20
        scroll_wait  #this is a clock.delay variable. It's value was set                      outside the loop. I'm just calling it here. 

正如您猜想的那样,该代码的结果是整行文本在延迟后同时出现。我一直在尝试根据需要对其进行编码,但我想出的大部分内容 returns 都带有 "cannot iterate through surface objects" 错误。

我对下一步该怎么做一头雾水。请注意,在过去的一年里,我自己断断续续地学习了一些代码,而且我还不知道我在做什么。任何和所有帮助将不胜感激。

提前感谢您的宝贵时间。

无需深入 pygame 细节,您只需更改迭代器,使其成为 returns 子字符串而不是字母:

def iterate_text(text):
    for r in range(len(text)):
        yield text[:r + 1]

这将 return 子字符串迭代:

for t in iterate_text('hello'):
    print t

# h
# he
# hel
# hell
# hello

使用单独的函数绘制字符串:

def draw_text(x, y, text):
    characters = [letter_IMGs[t] for t in text]
    cursor = x
    for char in characters:
        screen.blit(char, cursor, y)
        cursor += 20

在主循环中,您可以决定何时获取下一个字符。你基本上会做类似的事情:

 typewriter = iter_text('hello world')
 text_to_draw = None     
 advance_text = False

在循环之外的水平上,从一帧到另一帧都存在。当你想绘制下一个字符时,你将 advance_text 设置为 True,在主循环中:

 if typewriter and advance_text:
      text_to_draw = typewriter.next()
      advance_text = False # until you set it again

 if text_to_draw :
     draw_text(0,0, draw_text)

您可以通过用新文本重置打字机来重新开始,并通过在下一帧之前将 advance_text 设置为 True 来控制新字符出现的时间