如何在Pygame中保持窗口颜色更改效果?
问题解决:弹跳时窗口颜色持久切换且无拖影
问题根源
- 原代码每次循环固定填充白色
window.fill('white'),碰撞时临时设置的颜色会被下一帧的白色覆盖,导致颜色仅闪一下。 - 移除
window.fill()后,上一帧的图像无法被清除,图片移动后会留下拖影。
修正方案
用win_color变量存储当前窗口背景色,每次循环填充该变量对应的颜色;碰撞时仅更新win_color为随机值,既保留颜色,又能清除上一帧内容避免拖影。
修改后的代码
import pygame import random height = 500 width = 500 pygame.init() window = pygame.display.set_mode((500, 500)) pygame.display.set_caption('epic trampoline') colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'pink'] running = True win_color = 'white' # 用变量存储当前背景色 trampoline_color = 'black' clock = pygame.time.Clock() image = pygame.image.load('epicface.png').convert_alpha() epic_image = pygame.transform.scale(image, (50, 50)) epic_rect = epic_image.get_rect(center=(250, 0)) gravity = 0 acceleration = 1 while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False clock.tick(30) gravity += 0.6 # 填充当前背景色,替代固定白色 window.fill(win_color) epic_rect.bottom += gravity trampoline = pygame.draw.rect(window, trampoline_color, pygame.Rect(0, 440, 500, 10)) collide = pygame.Rect.colliderect(trampoline, epic_rect) if collide: epic_rect.bottom = trampoline.top # 仅更新背景色变量,不直接执行fill win_color = random.choice(colors) gravity = -18 window.blit(epic_image, epic_rect.topleft) pygame.display.flip() pygame.quit()
关键修改点
- 将固定的
window.fill('white')改为window.fill(win_color),每次循环用当前背景色填充窗口,清除上一帧残留内容。 - 碰撞时不再直接调用
window.fill(),而是修改win_color变量为随机颜色,让后续循环持续使用该颜色作为背景。 - 新增
pygame.quit(),退出时正确释放Pygame资源。
内容的提问来源于stack exchange,提问作者azzy
相关产品推荐
相关产品推荐

