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

Pygame游戏画面闪烁故障:调整背景速度后异常如何解决?

解决飞机游戏背景速度提升后的画面闪烁问题

问题根源

  1. 画面残留未清除:每一帧绘制新内容前没有清除旧画面,导致前后帧内容叠加,出现闪烁。
  2. 背景滚动逻辑错误:原来用y1 == 400判断重置位置,当evely大于1时,y1可能直接跳过400(比如从399跳到401),导致背景无法正确衔接,出现断层闪烁。

修复方案

1. 每一帧开始时清除画面

在绘制任何内容前,用纯色填充窗口或者绘制背景图覆盖整个区域,确保旧画面被完全清除,避免帧内容叠加。

2. 修改背景滚动的判断条件

把背景重置的判断从==改成>=,这样不管evely是多少,只要背景超出窗口范围就立即重置位置,保证背景衔接流畅。

3. 固定游戏帧率

使用Pygame的Clock对象控制帧率,避免画面刷新速度不稳定加剧闪烁。

修改后的完整代码

from random import randint
import time
import pygame as pg
pg.init()

win = pg.display.set_mode((500, 400))
# 新增:创建Clock对象控制帧率
clock = pg.time.Clock()

run = True
img = pg.image.load('a.png')
plane = pg.image.load('b.png')
ball = pg.image.load('c.png')
blast = pg.image.load('d.png')
ball = pg.transform.scale(ball, (30, 30))
ball2 = pg.image.load('e.png')
ball2 = pg.transform.scale(ball2, (30, 30))

x1 = 0
y1 = 0
y2 = -400

px = 225
py = 300

velx = 3
vely = 2

evely = 2

enemies = []
previous_time = int(time.time())

class Enemy:
    def __init__(self, x, y, color):
        self.x = x
        self.y = y
        self.color = color

    def collision(self, px, py):
        if px <= self.x+30 <= px+70 and py <= self.y <= py+30:
            return True
count = 0

while run:
    # 新增:固定帧率为60帧/秒,稳定画面刷新
    clock.tick(60)
    
    for event in pg.event.get():
        if event.type == pg.QUIT:
            run = False

    # 新增:清除画面(用黑色填充,可替换为你需要的背景色)
    win.fill((0, 0, 0))

    win.blit(img, (x1, y1))
    win.blit(img, (x1, y2))

    y1 += evely
    y2 += evely
    # 修改:用>=代替==,确保背景超出窗口就重置,避免速度变化导致的断层
    if y1 >= 400:
        y1 = -400
    if y2 >= 400:       
        y2 = -400

    keys = pg.key.get_pressed()
    if keys[pg.K_LEFT] and px > 0:
        px -= velx
    if keys[pg.K_RIGHT] and px < 450:
        px += velx
    if keys[pg.K_UP] and py > 0:
        py -= vely
    if keys[pg.K_DOWN] and py < 350:
        py += vely

    win.blit(plane, (px, py))

    if count == 20:
        enemies.append(Enemy(randint(0, 500), 0, randint(1, 2)))
        count = 0

    for i in range(len(enemies)):
        if enemies[i].collision(px, py):
            win.blit(blast, (px, py))
            pg.display.flip()
            pg.time.delay(1200)
            run = False
            break

        enemies[i].y += evely
        if enemies[i].color == 1:
            win.blit(ball, (enemies[i].x, enemies[i].y))
        else:
            win.blit(ball2, (enemies[i].x, enemies[i].y))

    count += 1

    pg.display.flip()

    if int(time.time()) - previous_time == 10:
        print("Level Upgraded")
        evely += 1
        previous_time = int(time.time())

pg.quit()
score = 0
for i in range(len(enemies)):
    if enemies[i].y > py:
        score += 1
print(f"Your score is {score}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:24:47