如何延迟从列表中迭代 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 来控制新字符出现的时间
我正在尝试为被 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 来控制新字符出现的时间