pythonpygamerender

Rendering text with multiple lines in pygame


I am trying to make a game and I am trying to render a lot of text. When the text renders, the rest of the text goes off the screen. Is there any easy way to make the text go to the next line of the pygame window?

helpT = sys_font.render \
                ("This game is a combination of all of the trends\n of 2016. When you press 'Start Game,' a menu will pop up. In order to beat the game, you must get a perfect score on every single one of these games.",0,(hecolor))
        screen.blit(helpT,(0, 0))

Solution

  • As I said in the comments; you have to render each word separately and calculate if the width of the text extends the width of the surface (or screen). Here's an example:

    import pygame
    pygame.init()
    
    
    SIZE = WIDTH, HEIGHT = (1024, 720)
    FPS = 30
    screen = pygame.display.set_mode(SIZE, pygame.RESIZABLE)
    clock = pygame.time.Clock()
    
    
    def blit_text(surface, text, pos, font, color=pygame.Color('black')):
        words = [word.split(' ') for word in text.splitlines()]  # 2D array where each row is a list of words.
        space = font.size(' ')[0]  # The width of a space.
        max_width, max_height = surface.get_size()
        x, y = pos
        for line in words:
            for word in line:
                word_surface = font.render(word, 0, color)
                word_width, word_height = word_surface.get_size()
                if x + word_width >= max_width:
                    x = pos[0]  # Reset the x.
                    y += word_height  # Start on new row.
                surface.blit(word_surface, (x, y))
                x += word_width + space
            x = pos[0]  # Reset the x.
            y += word_height  # Start on new row.
    
    
    text = "This is a really long sentence with a couple of breaks.\nSometimes it will break even if there isn't a break " \
           "in the sentence, but that's because the text is too long to fit the screen.\nIt can look strange sometimes.\n" \
           "This function doesn't check if the text is too high to fit on the height of the surface though, so sometimes " \
           "text will disappear underneath the surface"
    font = pygame.font.SysFont('Arial', 64)
    
    while True:
    
        dt = clock.tick(FPS) / 1000
    
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
    
        screen.fill(pygame.Color('white'))
        blit_text(screen, text, (20, 20), font)
        pygame.display.update()
    

    Result

    enter image description here