Не могу найти способ сделать несколько строк в Pygame - PullRequest
0 голосов
/ 12 июля 2019

Я знаю, что 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 Ответ

1 голос
/ 12 июля 2019

Это не 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...