You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:27:13