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
相关产品推荐
相关产品推荐

