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

如何在Pygame中保持窗口颜色更改效果?

问题解决:弹跳时窗口颜色持久切换且无拖影

问题根源

  1. 原代码每次循环固定填充白色window.fill('white'),碰撞时临时设置的颜色会被下一帧的白色覆盖,导致颜色仅闪一下。
  2. 移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:27:07