You need to enable JavaScript to run this app. pygame中物体移动时出现闪烁,已尝试screen.fill等方法未解决
优惠活动
大模型
产品
解决方案
定价
更多

pygame中物体移动时出现闪烁,已尝试screen.fill等方法未解决

闪烁问题根因

你当前的代码只存储了方块的位置矩形,没有把每个方块和它对应的纹理绑定,导致每帧所有方块的纹理都被随机刷新:

  • 主循环每帧开头都会随机选择新的全局rand_block纹理
  • draw_block绘制所有方块时,统一使用当前帧的全局rand_block,所有方块的纹理每一帧都在随机切换,视觉上呈现为闪烁效果
修复方法

调整方块存储结构,让每个方块同时保存纹理和位置信息:

  1. 修改create_block函数,生成方块时直接随机选择纹理,同时返回纹理和位置矩形,避免用全局变量传递纹理
  2. 调整移动、绘制函数,适配新的方块存储格式
  3. 删除主循环中每帧随机选择rand_block的冗余逻辑
修复后代码
import pygame, sys,random

def create_block():
    rand_block = random.choice(blck_array)
    rand_block_rect = rand_block.get_rect(topleft = (random.choice(blck_pos),-20))
    return (rand_block, rand_block_rect)

def move_block(blocks):
    for block in blocks:
        block[1].centery += 5
    return blocks

def draw_block(blocks):
    for block in blocks:
        screen.blit(block[0], block[1])

pygame.init()
screen = pygame.display.set_mode((500, 600))
clock = pygame.time.Clock()

blocks = {
    1: pygame.image.load('blocks/BLOCK L.png').convert_alpha(),
    2: pygame.image.load('blocks/BLOCK S.png').convert_alpha(),
    3: pygame.image.load('blocks/BLOCK M.png').convert_alpha(),
}
blck_array = [blocks[1], blocks[2], blocks[3]]
blck_pos = [3, 47, 190, 250, 357]

block_list = []

SPAWNPIPE = pygame.USEREVENT
pygame.time.set_timer(SPAWNPIPE, 1200)

loop = True
while loop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == SPAWNPIPE:
            block_list.append(create_block())

    screen.fill((255,255,255))
    block_list = move_block(block_list)
    draw_block(block_list)
    pygame.display.update()
    clock.tick(120)
额外优化说明
  • 图片加载时添加convert_alpha()可以优化透明纹理的渲染效率,降低性能消耗
  • 后续如果需要扩展方块属性,建议使用自定义类或者字典存储方块信息,可读性会高于元组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 20:15:04