python - Python/Pygame 在离开窗口时使 Pygame 中的文本换行
问题描述
我有一个呈现文本的文本函数。函数如下
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)
但是,我的 msg 字符串太长,它会呈现在窗口外。
有没有办法让我的文本注册对我的窗口来说太长,所以在文本开头下方继续?类似于计算机如何自动完成
有点像这样:
解决方案
没有自动解决方案。您必须自己实现文本换行并逐行逐字绘制文本。
幸运的是 PyGame wiki 为这个任务提供了一个函数。请参阅 PyGame wiki Simple Text Wrapping for pygame。
我扩展了函数并添加了一个附加参数,它提供左对齐或右对齐文本、居中文本甚至块模式:
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, color, 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, 0), textRect, 1)
drawTextRect = textRect.inflate(-5, -5)
drawText(window, msg, (0, 0, 0), drawTextRect, font, textAlignBlock, True)
pygame.display.flip()
推荐阅读
- vue.js - Vue jest $refs 函数和组件模拟问题
- python - Python Pyglet 减慢了动画的速度。物体在屏幕上缓慢绘制
- purescript - 在 purescript 中组合不同类型的变体列表
- c# - ML 代理没有学习相对“简单”的任务
- c - `ioctl` 在尝试 TUNSETIFF 一个 TUN 设备时返回 -1
- c - STM32f769 上的 noMMU UcLinux 内存不足
- java - Java:Sytem.out/in/err 文件使用哪些隐式编码?
- node.js - 如何检查对 mongoose 文档对象的数据库更改?
- c++ - 使用向量的分割问题(在 C++ 中实现桶排序)
- java - Hashtable get(kType key) 如何摊销时间复杂度 O(1) 而不是 O(log n)?