如何延迟从列表中迭代的blits

时间:2015-04-09 20:04:24

标签: python pygame

我正在尝试为blitted文本创建打字机效果。通过打字机效果,我只是意味着我试图避免整个文本立即在屏幕上显示。相反,我试图让每个字母单独出现,在字符串中的下一个字符出现之前稍有延迟。

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

e.g:

    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. 

现在您猜测,该代码的结果是整个文本行在延迟后同时出现。我一直在尝试根据需要对其进行编码,但我提出的大部分内容都返回“无法迭代表面对象”错误。

我几乎不知道接下来应该怎么做。请注意,在过去的一年中,我自己一直在学习一些代码,无论是开始还是关闭,我还不知道我在做什么。任何和所有的帮助将不胜感激。

提前感谢您的时间。

1 个答案:

答案 0 :(得分:2)

如果没有太多进入pygame规范,你只需要更改迭代器,这样它就会返回子字符串而不是字母:

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

将迭代地返回子字符串:

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来控制出现新角色的时间