Pygame游戏画面闪烁故障:调整背景速度后异常如何解决?
解决飞机游戏背景速度提升后的画面闪烁问题
问题根源
- 画面残留未清除:每一帧绘制新内容前没有清除旧画面,导致前后帧内容叠加,出现闪烁。
- 背景滚动逻辑错误:原来用
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
相关产品推荐
相关产品推荐

