求助:Pygame游戏画布无法渲染玩家分数文本
Pygame Pong游戏分数文本不显示问题解决
我用Pygame开发Pong复刻游戏,之前所有内容渲染都正常,但添加玩家分数文本后无法显示。我参考文档和其他来源复制了文本渲染代码,单独测试能正常运行,但放到游戏里就不行。以下是我的main.py代码:
import pygame from paddles import * from controls import * from ball import * pygame.font.init() # SCREEN INIT pygame.init() win = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Pong") # VARIABLES ball_radius = 7 paddle_speed = 5 paddle_length = 100 FPS = 60 # DEFINE OBJECTS paddle1 = Paddle(paddle_length, 15, 100, paddle_speed, True, WHITE) paddle2 = Paddle(paddle_length, 970, 100, paddle_speed, False, WHITE) ball = Ball(WIDTH // 2, HEIGHT // 2, ball_radius) font = pygame.font.SysFont(None, 24) # COLLISION MANAGEMENT def handle_collision(ball, paddle1, paddle2): if ball.y + ball.radius >= HEIGHT: ball.y_vel *= -1 elif ball.y - ball.radius <= 0: ball.y_vel *= -1 if ball.x_vel < 0: if paddle1.y <= ball.y <= paddle1.y + paddle1.height: if ball.x - ball.radius <= paddle1.x + paddle1.width: ball.x_vel *= -1 middle_y = paddle1.y + paddle1.height / 2 difference_in_y = middle_y - ball.y reduction_factor = (paddle1.height / 2) / ball.MAX_VEL y_vel = difference_in_y / reduction_factor ball.y_vel = -1 * y_vel else: if paddle2.y <= ball.y <= paddle2.y + paddle2.height: if ball.x + ball.radius >= paddle2.x: ball.x_vel *= -1 middle_y = paddle2.y + paddle2.height / 2 difference_in_y = middle_y - ball.y reduction_factor = (paddle2.height / 2) / ball.MAX_VEL y_vel = difference_in_y / reduction_factor ball.y_vel = -1 * y_vel # HANDLE ALL GRAPHICS def graphics(screen): screen.fill(BLACK) paddle1.draw(screen) paddle2.draw(screen) ball.draw(screen) # DRAWS DOTTED LINE for i in range(10, HEIGHT, HEIGHT // 20): if i % 2 == 1: continue pygame.draw.rect(screen, WHITE, (WIDTH // 2 - 5, i, 8, HEIGHT // 40)) # GAME LOOP def main(): run = True clock = pygame.time.Clock() P1_SCORE, P2_SCORE = 0, 0 #ISSUE HERE!!! my_font = pygame.font.SysFont('Comic Sans MS', 30) text_surface = my_font.render(str(P1_SCORE), False, (255, 255, 255)) while run: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False win.blit(text_surface, (250,250)) paddle1.move() paddle2.move() ball.move() handle_collision(ball, paddle1, paddle2) P1_SCORE, P2_SCORE = ball.check_win(P1_SCORE, P2_SCORE) graphics(win) pygame.display.update() print(f"player 1: {P1_SCORE}, player 2: {P2_SCORE}") pygame.quit() if __name__ == '__main__': main()
问题原因及修复
- 绘制顺序错误:你先绘制文本,再调用
graphics函数,而graphics里的screen.fill(BLACK)会把文本完全覆盖,导致看不到。 - 文本未实时更新:初始只渲染了一次分数为0的文本,后续分数变化时,
text_surface不会自动更新,所以始终显示0。
修改后的核心代码
调整绘制顺序,并在每次循环中重新渲染分数文本:
def main(): run = True clock = pygame.time.Clock() P1_SCORE, P2_SCORE = 0, 0 my_font = pygame.font.SysFont('Comic Sans MS', 30) while run: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False paddle1.move() paddle2.move() ball.move() handle_collision(ball, paddle1, paddle2) P1_SCORE, P2_SCORE = ball.check_win(P1_SCORE, P2_SCORE) # 先绘制背景和游戏元素 graphics(win) # 每次循环重新渲染最新分数 text_p1 = my_font.render(str(P1_SCORE), False, (255, 255, 255)) text_p2 = my_font.render(str(P2_SCORE), False, (255, 255, 255)) # 绘制到屏幕顶部左右位置 win.blit(text_p1, (WIDTH // 4, 20)) win.blit(text_p2, (WIDTH * 3 // 4, 20)) pygame.display.update() print(f"player 1: {P1_SCORE}, player 2: {P2_SCORE}") pygame.quit()
额外提示
- 文本绘制必须放在所有背景填充和基础元素绘制之后,才不会被覆盖;
- 每次循环都要调用
render方法,确保分数变化时文本同步更新; - 可以根据需求调整文本的字体、大小、颜色和位置,优化显示效果。
内容的提问来源于stack exchange,提问作者David Safro
相关产品推荐
相关产品推荐

