问题描述
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)
但是我的味精字符串太长,它将在窗口外呈现。
有没有一种方法可以注册我的文本,而这对于我的窗口来说太长了,因此可以在文本开头下方继续?类似于计算机如何自动完成所有操作
排序如下:
解决方法
没有自动解决方案。您必须自己实现文本环绕,并逐行逐字地绘制文本。
幸运的是,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()