Rendering text with multiple lines in pygame

后端 未结 9 1591
日久生厌
日久生厌 2020-11-29 12:15

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 g

9条回答
  •  隐瞒了意图╮
    2020-11-29 12:42

    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

提交回复
热议问题