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

求助: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()

问题原因及修复

  1. 绘制顺序错误:你先绘制文本,再调用graphics函数,而graphics里的screen.fill(BLACK)会把文本完全覆盖,导致看不到。
  2. 文本未实时更新:初始只渲染了一次分数为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:00:56