pygame中物体移动时出现闪烁,已尝试screen.fill等方法未解决
闪烁问题根因
你当前的代码只存储了方块的位置矩形,没有把每个方块和它对应的纹理绑定,导致每帧所有方块的纹理都被随机刷新:
- 主循环每帧开头都会随机选择新的全局
rand_block纹理 draw_block绘制所有方块时,统一使用当前帧的全局rand_block,所有方块的纹理每一帧都在随机切换,视觉上呈现为闪烁效果
修复方法
调整方块存储结构,让每个方块同时保存纹理和位置信息:
- 修改
create_block函数,生成方块时直接随机选择纹理,同时返回纹理和位置矩形,避免用全局变量传递纹理 - 调整移动、绘制函数,适配新的方块存储格式
- 删除主循环中每帧随机选择
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
相关产品推荐
相关产品推荐

