Pygame教程#2:包装文字

在上一教程中,我描述了如何使用大小,颜色等渲染文本。现在,我将包装文本。

Pygame中自动换行的主要问题是,无论您对字符串进行什么操作,整个字符串只会打印成一行 。 因此,它可能会伸出窗外。 我确实找到了一个可以正确包装文字的函数:https://www.pygame.org/wiki/TextWrap。

我还写了有关如何使用它以及如何在这里工作的教程:
https://medium.com/@knivecmaksim/pygame-tutorial-2-1-precise-text-wrapping-method-68576b43ec92。 (如果您要寻找一种精确的包装方法,我强烈建议您阅读本教程)

如果您想学习制作包装函数的过程,请继续阅读本文。 但是,我极力劝阻您不要在本教程中使用我的函数,因为它写得不好。

好吧,让我们开始吧。

由于即使在字符串中使用换行符也无法中断换行,因此必须以正确的时间间隔分割消息,然后使用for循环迭代message_display()函数。 这是textwrap模块派上用场的地方。

textwrap模块的工作方式类似于list() 函数,但它以指定的时间间隔分割字符串。

让我们导入模块。

 导入文字换行 

现在,让我们编写函数:

  def wrap_text(消息,wraplimit): 
返回textwrap.fill(消息,wraplimit)

它仍然无法完成任务,因为Pygame将在一行中呈现任何文本。 因此,让我们编写for循环。

但这是一个问题,当使用带有随机字体的textwrap时,用于包装文本的值可能会有所不同。 这就是为什么我们现在必须使用等宽字体。 Pygame中可用的mono类型字体的名称为“ freemono”。

让我们建立一些固定值。 如果您的屏幕是1366×766,这些应该可以解决问题:

  textvars = {'大':[90,22,90],'中':[50,43,45],'普通':[25,88,20],'小':[15,148,10]} 

因此,基本上,列表由3个元素组成:文本大小,一行中可以容纳的最大字符数以及垂直间距宽度。

现在我们有了适当的值,让我们使用for循环显示文本:

  def message_display(myfont,textvars,color,xy,wrap,message): 
xy = xy [:]#因此我们不会修改原始值
font_object = pygame.font.Font(myfont,textvars [0])
消息= wrap_text(消息,textvars [1])
对于message.split('\ n')的一部分:
render_text = font_object.render(part,True,(color))
screen.blit(rendered_text,(xy))
xy [1] + = textvars [2]
pygame.display.update()

现在,让我们尝试一下此功能。

完善。 现在它可以工作了,让我们使包装是可选的。 只需在for循环之前插入以下两行代码:

 如果换行: 
消息= textwrap.fill(消息,textvars [1])

但这还不是全部。 如果我们要在其他位置渲染文本怎么办? 为了方便起见,我们当前的X位置是5或0,但是出于任何原因,我们可能都想更改它。 尝试将X位置更改为300或500。

由于值是固定的,因此不会包装文本,因此我们需要进行一些计算:

 如果换行: 
char_size = size [0] / textvars [1]#一个字符的大小
new_wrap =(size [0]-xy [0])/ char_size#包装点
消息= textwrap.fill(消息,轮(new_wrap))

让我们将文本移到中间,看看现在是否可以自动换行。

这也应适用于其他尺寸。 让我们尝试一下“中级”。

如您所见,我们还需要确保文本不会在窗口外呈现。 如果文本太大而无法容纳在窗口中,则当Y位置超出限制时,循环将中断。

 对于message.split('\ n')的一部分: 
render_text = font_object.render(part,True,(color))
screen.blit(rendered_text,(xy))
xy [1] + = textvars [2]
如果xy [1]> = size [1]:
不返回
pygame.display.update()

此时,文本几乎正确地换行了。 唯一的缺点是您只能使用一种字体。 尽管如此,它仍然很棒。

本教程就是这样。 感谢您的阅读!