如何在绿色矩形的内部区域添加一个字符串?
GeoFence类用来描述绿色矩形,并且每个矩形都有一个风险等级risk_level。
风险等级由字符串数组risks随机产生,字符串数组risks中有“高”、“中”、低”三组元素。
在GeoFence类中,文本risk_level使用Arial字体,字体大小为 25。
想要将risk_level显示在矩形内部的正中央位置,但在尝试执行代码后,发现文本未显示。
2、解决方案
方法一:
问题在于,屏幕表面在下一帧被清空后,risk_level文本将消失。
要解决这个问题,需要将文本risk_level绘制在矩形self.image上,而不是在屏幕表面上。
class GeoFence(pygame.sprite.Sprite):
def __init__(self, rect, risk_level, *groups):
self._layer = 1
pygame.sprite.Sprite.__init__(self, groups)
text_surface = FONT.render(risk_level, True, (255,0,0))
self.image = pygame.surface.Surface(text_surface.get_size())
self.image.fill(GREEN)
self.image.blit(text_surface, (0, 0))
self.rect = self.image.get_rect(topleft=rect.topleft)
self.risk_level = risk_level
在这里,文本risk_level被渲染成了一个text_surface,然后用一个大小与text_surface相同的绿色self.image表面填充,最后将text_surface绘制在self.image的左上角。
self.rect被定义为self.image的边界框,而self.risk_level被赋值为风险等级。
方法二:
也可以通过把risk_level文本渲染成一个表面来简化代码。
class GeoFence(pygame.sprite.Sprite):
def __init__(self, rect, risk_level, *groups):
self._layer = 1
pygame.sprite.Sprite.__init__(self, groups)
self.image = FONT.render(risk_level, True, (255,0,0), GREEN)
self.rect = self.image.get_rect(topleft=rect.topleft)
self.risk_level = risk_level
在这里,FONT.render()函数可以同时设置文本的颜色和绿色背景。这样,self.image就成了一个包含risk_level文本的绿色表面,而self.rect则是这个表面边界框。
方法三:
如果希望将文本risk_level居中显示,可以使用另一个text_rect,并将其中心坐标设置为self.rect的中心坐标,最后将文本risk_level绘制在text_rect上。
class GeoFence(pygame.sprite.Sprite):
def __init__(self, rect, risk_level, *groups):
self._layer = 1
pygame.sprite.Sprite.__init__(self, groups)
text_surface = FONT.render(risk_level, True, (255,0,0))
self.image = pygame.surface.Surface(
(text_surface.get_width()+110, text_surface.get_height()+20))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
text_rect = text_surface.get_rect(center=self.rect.center)
self.image.blit(text_surface, text_rect)
self.rect.topleft = rect.topleft
在这里,self.rect被创建,但还没有设置坐标,然后text_rect被创建,并将其中心坐标设置为self.rect的中心坐标。
文本risk_level被绘制在text_rect上,最后self.rect被设置到矩形rect的左上角。