微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

离开窗口时,Python / Pygame在Pygame中自动换行

如何解决离开窗口时,Python / Pygame在Pygame中自动换行

我有一个呈现文本的text函数。该函数如下

def textFunc(font,msg,color,x,y,center):
    text_render = font.render(msg,True,color)
    text_rect = text_render.get_rect()
    
    #If center is true,then the X,Y will be used as the center
    if center == True:
        text_rect.center = (x,y)
    else:
        text_rect = (x,y)
    game_display.blit(text_render,text_rect)

但是我的味精字符串太长,它将在窗口外呈现。

有没有一种方法可以注册我的文本,而这对于我的窗口来说太长了,因此可以在文本开头下方继续?类似于计算机如何自动完成所有操作

排序如下:

Text

解决方法

没有自动解决方案。您必须自己实现文本环绕,并逐行逐字地绘制文本。
幸运的是,PyGame Wiki提供了用于此任务的功能。请参阅PyGame Wiki Simple Text Wrapping for pygame

我扩展了该函数并添加了一个附加参数,该参数提供了 left right 对齐的文本,居中的文本甚至是阻止模式:

textAlignLeft = 0
textAlignRight = 1
textAlignCenter = 2
textAlignBlock = 3

def drawText(surface,text,color,rect,font,align=textAlignLeft,aa=False,bkg=None):
    lineSpacing = -2
    spaceWidth,fontHeight = font.size(" ")[0],font.size("Tg")[1]

    listOfWords = text.split(" ")
    if bkg:
        imageList = [font.render(word,1,bkg) for word in listOfWords]
        for image in imageList: image.set_colorkey(bkg)
    else:
        imageList = [font.render(word,aa,color) for word in listOfWords]

    maxLen = rect[2]
    lineLenList = [0]
    lineList = [[]]
    for image in imageList:
        width = image.get_width()
        lineLen = lineLenList[-1] + len(lineList[-1]) * spaceWidth + width
        if len(lineList[-1]) == 0 or lineLen <= maxLen:
            lineLenList[-1] += width
            lineList[-1].append(image)
        else:
            lineLenList.append(width)
            lineList.append([image])

    lineBottom = rect[1]
    lastLine = 0
    for lineLen,lineImages in zip(lineLenList,lineList):
        lineLeft = rect[0]
        if align == textAlignRight:
            lineLeft += + rect[2] - lineLen - spaceWidth * (len(lineImages)-1)
        elif align == textAlignCenter:
            lineLeft += (rect[2] - lineLen - spaceWidth * (len(lineImages)-1)) // 2
        elif align == textAlignBlock and len(lineImages) > 1:
            spaceWidth = (rect[2] - lineLen) // (len(lineImages)-1)
        if lineBottom + fontHeight > rect[1] + rect[3]:
            break
        lastLine += 1
        for i,image in enumerate(lineImages):
            x,y = lineLeft + i*spaceWidth,lineBottom
            surface.blit(image,(round(x),y))
            lineLeft += image.get_width() 
        lineBottom += fontHeight + lineSpacing

    if lastLine < len(lineList):
        drawWords = sum([len(lineList[i]) for i in range(lastLine)])
        remainingText = ""
        for text in listOfWords[drawWords:]: remainingText += text + " "
        return remainingText
    return ""

最小示例: repl.it/@Rabbid76/PyGame-TextWrap

import pygame

pygame.init()
font = pygame.font.SysFont(None,40)

msg = "Simple function that will draw text and wrap it to fit the rect passed.  If there is any text that will not fit into the box,the remaining text will be returned."
textRect = pygame.Rect(100,100,300,300)

window = pygame.display.set_mode((500,500))
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill((255,255,255))
    pygame.draw.rect(window,(0,0),textRect,1)
    drawTextRect = textRect.inflate(-5,-5)
    drawText(window,msg,drawTextRect,textAlignBlock,True)
    pygame.display.flip()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。