如何在绿色矩形的内部区域添加一个字符串?
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
的左上角。