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

如何用Python的Pygame实现背景图无限滚动?滚动时出现灰色区域

解决Pygame滚动背景出现灰色区域的问题

灰色区域出现的核心原因是窗口未被背景图完全覆盖,可能是图片尺寸不足、绘制前未填充底色,或是滚动逻辑存在漏绘。以下是针对性的修复方案:

1. 确保背景图覆盖窗口高度

你的窗口高度设为600,如果加载的bg2.png高度小于600,垂直方向会露出窗口默认的灰色背景。可以通过缩放图片解决:

bg = py.image.load("./Data/sky_background/bg2.png").convert()
# 按窗口高度等比例缩放图片,保证垂直方向无空隙
bg = py.transform.scale(bg, (int(bg.get_width() * FrameHeight / bg.get_height()), FrameHeight))

2. 绘制前填充窗口底色

即使图片尺寸足够,滚动重置的瞬间可能出现短暂灰色。在每次循环开始时,用和背景图匹配的颜色填充整个窗口:

# 主循环最开头添加,颜色值替换为你背景图的主色调
screen.fill((135, 206, 235))  # 示例:天空蓝

3. 调整Tile数量避免横向漏绘

当前的Tile计算逻辑基本正确,但多添加一个Tile可以彻底避免横向边缘的灰色露出:

tiles = math.ceil(FrameWidth / bg.get_width()) + 2

修复后的完整代码

import math 
import pygame as py 
  
py.init() 
  
clock = py.time.Clock() 
  
FrameHeight = 600
FrameWidth = 1200
  
py.display.set_caption("Endless Scrolling in pygame") 
screen = py.display.set_mode((FrameWidth, FrameHeight)) 
  
# 加载并缩放背景图
bg = py.image.load("./Data/sky_background/bg2.png").convert()
bg = py.transform.scale(bg, (int(bg.get_width() * FrameHeight / bg.get_height()), FrameHeight))
  
scroll = 0
tiles = math.ceil(FrameWidth / bg.get_width()) + 2
  
running = True
while running: 
    clock.tick(33) 
  
    # 填充底色,避免灰色露出
    screen.fill((135, 206, 235))
  
    # 绘制滚动的背景Tile
    for i in range(tiles): 
        screen.blit(bg, (bg.get_width() * i + scroll, 0)) 
  
    scroll -= 20
  
    # 重置滚动值
    if abs(scroll) >= bg.get_width(): 
        scroll = 0
  
    # 处理退出事件
    for event in py.event.get(): 
        if event.type == py.QUIT: 
            running = False
  
    py.display.flip() 
  
py.quit() 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:25:26