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

Python3.9.6 Pygame打字竞速游戏滚动背景实现问题求助

Pygame打字竞速游戏背景滚动故障修复方案

核心问题点

  • 滚动背景绘制逻辑放在了事件遍历循环内,只有触发键盘、窗口操作等事件时才会执行,无事件时滚动逻辑完全不运行,导致看起来背景没动
  • 同时存在两套背景绘制逻辑,事件循环里算完滚动位置绘制完后,后面调用的background()函数会用原始的backgroundX坐标再盖一层背景,直接覆盖了滚动效果
  • 背景Y坐标混用,事件循环里绘制时用Y=0,background()函数里用backgroundY=-225,坐标不一致会出现显示错位
  • 未导入sys模块,触发窗口关闭事件时调用sys.exit()会直接报错崩溃

修复后可运行代码

import pygame
import sys

pygame.init()

# 设置游戏窗口
screen = pygame.display.set_mode((1000, 800))
pygame.display.set_caption("Typing Racer!")
icon = pygame.image.load("exercise (1).png")
pygame.display.set_icon(icon)

# 背景资源与参数
backgroundImg = pygame.image.load("panoramic-view-field-covered-grass-trees-sunlight-cloudy-sky.jpg")
backgroundX = 0
backgroundY = -225
bg_width = backgroundImg.get_rect().width

# 玩家资源与参数
playerImg = pygame.image.load("running-man.png")
playerX = 400
playerY = 100

# 怪物资源与参数
objectImg = pygame.image.load("godzilla.png")
objectX = 200
objectY = 100

# 字体与输入框配置
text_font = pygame.font.Font(None, 32)
user_text = ""
input_rect = pygame.Rect(395, 490, 250, 40)

clock = pygame.time.Clock() # 用来固定帧率避免不同设备运行速度不一致

while True:
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_BACKSPACE:
                user_text = user_text[:-1]
            else:
                user_text += event.unicode
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    
    # 计算背景滚动偏移
    bg_scroll_x = backgroundX % bg_width
    # 绘制循环背景,放在所有元素最底层
    screen.blit(backgroundImg, (bg_scroll_x, backgroundY))
    if bg_scroll_x < 1000:
        screen.blit(backgroundImg, (bg_scroll_x - bg_width, backgroundY))
    
    # 绘制上层元素
    screen.blit(playerImg, (playerX, playerY))
    screen.blit(objectImg, (objectX, objectY))
    
    # 绘制输入框与文字
    text_surface = text_font.render(user_text, True, (255 ,255 ,255))
    screen.blit(text_surface, (input_rect.x + 5, input_rect.y + 10))
    pygame.draw.rect(screen, (128, 128, 0), input_rect, 3)
    
    # 更新背景滚动位置
    backgroundX -= 0.8
    
    pygame.display.update()
    clock.tick(60) # 固定60帧,避免设备性能差异导致滚动速度不一样

修改说明

  • 把背景滚动的计算和绘制逻辑移到了事件遍历循环外,保证每帧都会执行
  • 删掉了重复的background()函数调用,统一用滚动计算后的坐标绘制背景
  • 补充导入了sys模块避免关闭窗口时报错
  • 新增了帧率控制,避免不同设备上滚动速度差异过大
  • 提前计算了背景宽度,不用每帧重复调用get_rect(),优化性能

内容的提问来源于stack exchange,提问作者Toby Host

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:00:03