如何在Pygame的Sprite中添加随精灵移动的文本?
解决Pygame Sprite中添加随精灵移动的文本问题
问题描述
尝试在Pygame的Sprite中添加文本但未成功,此前曾成功显示文本但文本位于精灵下方,希望实现文本随精灵一起移动。
原代码
import pygame class Player(pygame.sprite.Sprite): def __init__(self, Team, Position): super().__init__() self.window = pygame.display.set_mode((1280, 800)) self.red = (255, 0, 0) self.blue = (0, 0, 255) self.Team = Team self.Position = Position self.CurrentPosition = "" self.PlayerName = self.PlayerFinder('Name') if self.PlayerName is None: if self.Position == 'LW': self.Position = 'LM' elif self.Position == 'RW': self.Position = 'RM' self.PlayerName = self.PlayerFinder('Name') self.Nationality = "" self.Pace = "" self.Shoot = "" self.Pass = "" self.Dribble = "" self.GKDive = "" self.Reflex = "" # Player self.image = pygame.Surface([20, 20]) self.rect = self.image.get_rect() def PlayerFinder(self, key): # 原代码未提供该方法实现,此处留空 return None def DrawPlayerShape(self, co_ordinate, colouropt): self.CurrentPosition = co_ordinate # Colour option colour = "" if colouropt == 'R': colour = self.red elif colouropt == 'B': colour = self.blue # Player's shape as a sprite self.image.fill(colour) self.rect.center = co_ordinate # Player's football position shown in the shape if self.Position == 'CDM': # this ensures that they will fit inside the player shape text_type = pygame.font.SysFont('arialunicode', 11).render(self.Position, True, (0, 0, 0)) else: text_type = pygame.font.SysFont('arialunicode', 15).render(self.Position, True, (0, 0, 0)) self.image.blit(text_type, self.image) # 原实例化代码参数缺失 # st = Player() # st.DrawPlayerShape()
问题分析与修改方案
1. 文本绘制位置错误
原代码中self.image.blit(text_type, self.image)的第二个参数错误,应传入文本的坐标而非精灵Surface对象。需要计算文本在精灵Surface上的居中位置,确保文本显示在精灵内部。
2. 重复创建字体对象
每次调用DrawPlayerShape都重新创建字体对象,会降低性能,建议在__init__中预初始化字体。
3. 窗口创建位置错误
窗口应在Sprite类外部创建,避免重复初始化窗口。
4. 实例化参数缺失
Player类的__init__需要Team和Position参数,原实例化代码缺少这些参数。
修改后的代码
import pygame pygame.init() # 全局创建窗口,避免在Sprite类中重复初始化 window = pygame.display.set_mode((1280, 800)) class Player(pygame.sprite.Sprite): def __init__(self, Team, Position): super().__init__() self.red = (255, 0, 0) self.blue = (0, 0, 255) self.Team = Team self.Position = Position self.CurrentPosition = "" self.PlayerName = self.PlayerFinder('Name') if self.PlayerName is None: if self.Position == 'LW': self.Position = 'LM' elif self.Position == 'RW': self.Position = 'RM' self.PlayerName = self.PlayerFinder('Name') self.Nationality = "" self.Pace = "" self.Shoot = "" self.Pass = "" self.Dribble = "" self.GKDive = "" self.Reflex = "" # 初始化精灵Surface和rect self.image = pygame.Surface([20, 20]) self.rect = self.image.get_rect() # 预初始化字体,提升性能 self.font_small = pygame.font.SysFont('arialunicode', 11) self.font_normal = pygame.font.SysFont('arialunicode', 15) def PlayerFinder(self, key): # 根据实际需求实现该方法 return "TestPlayer" def DrawPlayerShape(self, co_ordinate, colouropt): self.CurrentPosition = co_ordinate # 设置精灵颜色 colour = self.red if colouropt == 'R' else self.blue # 填充精灵背景色 self.image.fill(colour) # 更新精灵在窗口中的位置 self.rect.center = co_ordinate # 渲染文本 text_surface = self.font_small.render(self.Position, True, (0, 0, 0)) if self.Position == 'CDM' else self.font_normal.render(self.Position, True, (0, 0, 0)) # 计算文本在精灵上的居中位置 text_rect = text_surface.get_rect(center=self.image.get_rect().center) # 将文本绘制到精灵的Surface上 self.image.blit(text_surface, text_rect) # 正确实例化Player对象 player = Player("RedTeam", "CDM") player.DrawPlayerShape((640, 400), 'R') # 主循环示例,用于测试显示效果 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False window.fill((255,255,255)) # 将精灵绘制到窗口 window.blit(player.image, player.rect) pygame.display.flip() pygame.quit()
关键修改说明
- 把字体初始化移到
__init__中,避免重复创建资源,提升运行效率。 - 修正文本绘制位置,通过
get_rect(center=...)让文本居中显示在精灵内部。 - 将窗口创建移到类外部,符合Pygame的常规使用逻辑。
- 修复实例化时的参数缺失问题,确保代码可正常运行。
内容的提问来源于stack exchange,提问作者Kelan Westwood
相关产品推荐
相关产品推荐

