找不到在pygame中制作多行的方法

时间:2019-07-12 00:37:03

标签: python python-3.x pygame

我知道pygame的screen.blit并不旨在支持多行,但是我无法解决。提出这个问题的所有其他线程都无法与我的代码一起使用。我该如何进行这项工作?

我尝试通过在splitline()上使用DisplayRoom.prompt将响应分为两个,然后让游戏仅分别加载两行,但是DisplayRoom.prompt.splitline()并没有将`DisplayRoom.prompt从一个元组到列表,并且只返回它的值。

screen.fill(background_colour)
txt_surface = userfont.render(text, True, color)
screen.blit(txt_surface, (100, 800))
response = promptfont.render(DisplayRoom.prompt, True, color)
screen.blit(response, (80, 300))
pygame.display.flip()
clock.tick_busy_loop(60)  # limit FPS

当我定义DisplayRoom.prompt时,我希望\ n对其进行换行,但是它不起作用,这就是为什么我在这里。

1 个答案:

答案 0 :(得分:1)

不是Surface.blit不支持多行。 blit只是在另一个Surface上绘制了一个Surface,并不关心Surface包含什么。

它是pygame.Font.render,不支持多行。文档清楚地说:

  

文本只能是一行:不显示换行符。

所以我不知道您的代码中的DisplayRoom.prompt是什么,但是如果不是字符串,则注定会失败:render会引发TypeError: text must be a unicode or bytes
而且,如果是带有换行符的字符串,则不会显示换行符。

您必须拆分文本并分别渲染每一行。

在下面的示例中,我创建了一个简单的函数blitlines,该函数说明了您可以如何做。

import sys
import pygame

def blitlines(surf, text, renderer, color, x, y):
    h = renderer.get_height()
    lines = text.split('\n')
    for i, ll in enumerate(lines):
        txt_surface = renderer.render(ll, True, color)
        surf.blit(txt_surface, (x, y+(i*h)))


background_colour = (0, 0, 0)
textcolor = (255, 255, 255)

multitext = "Hello World!\nGoodbye World!\nI'm back World!"

pygame.init()
screen = pygame.display.set_mode((500, 500))
userfont = pygame.font.Font(None, 40)

screen.fill(background_colour)
blitlines(screen, multitext, userfont, textcolor, 100, 100)

pygame.display.flip()

#main loop
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

这是屏幕上的结果。

sample image