如何在pygame中逐个字母制作文本?

时间:2018-11-24 22:01:47

标签: python pygame

对于我正在制作的某款游戏,我认为如果每个字母一个字母一个字母而不是一次全部字母看起来会好得多。我该怎么办?

2 个答案:

答案 0 :(得分:0)

第一个念头:

您可以创建动画功能:

这可能是遍历每个字符并显示它们的循环。唯一真正的问题是主线程(pygame的)的中断时间会减慢游戏逻辑的其余部分。

更好的代名词

另一种选择是将字母像精灵一样渲染并逐个移动-通过设置其运动,可以消除延迟。

答案 1 :(得分:0)

您可以使用迭代器轻松完成此操作。只需从原始文本创建一个迭代器,调用next(iterator)以获取下一个字符,并将一个接一个的添加到字符串变量中,直到其长度等于原始字符串的长度。

要重新启动动画或显示其他文本,请创建一个新的迭代器text_iterator = iter(text_orig),然后再次设置text = ''

我还在这里使用ptext库,因为它能够识别换行符以创建多行文本。

import pygame as pg
import ptext


pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
BLUE = pg.Color('dodgerblue')
# Triple quoted strings contain newline characters.
text_orig = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua.

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum."""

# Create an iterator so that we can get one character after the other.
text_iterator = iter(text_orig)
text = ''

done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True
        # Press 'r' to reset the text.
        elif event.type == pg.KEYDOWN:
            if event.key == pg.K_r:
                text_iterator = iter(text_orig)
                text = ''

    if len(text) < len(text_orig):
        # Call `next(text_iterator)` to get the next character,
        # then concatenate it with the text.
        text += next(text_iterator)

    screen.fill(BG_COLOR)
    ptext.draw(text, (10, 10), color=BLUE)  # Recognizes newline characters.
    pg.display.flip()
    clock.tick(60)

pg.quit()

另一种选择是切字符串:

i = 0  # End position of the string.
done = False
while not done:
    # ...
    i += 1.5  # You can control the speed here.

    screen.fill(BG_COLOR)
    ptext.draw(text_orig[:int(i)], (10, 10), color=BLUE)

要重新启动,只需设置i = 0

[enter image description here