Pygame开发Flappy Bird复刻版出现图形闪烁、管道偏移问题如何解决
这是代码逻辑错误导致的,和Pygame引擎本身无关,核心存在两个问题:
- 遍历
pipes列表的同时执行删除操作,会导致遍历跳过部分元素。Python的for循环遍历列表是按索引依次取值,如果你遍历到索引为i的元素时将其删除,后续元素的索引会整体前移1位,下一轮循环会直接取索引i+1的元素,相当于跳过了原来索引为i+1、现在变为i的元素。被跳过的元素这一帧不会执行左移、渲染逻辑,就会出现偏移、闪烁的问题。 - 用
pipes.index(pipe)判断管道上下朝向的逻辑不稳定,当列表有新增、删除操作时,原有管道的索引会发生变化,且如果列表存在坐标相同的管道,index方法只会返回第一个匹配元素的索引,会导致管道渲染颠倒,也是异常的诱因之一。
修复方案
1. 改造管道创建逻辑,直接存储管道对应的渲染资源,避免依赖索引判断朝向
def create_new_pipe(): bottom_pipe_position = random.randrange(24+pipe_vertical_spacing, screenh-168) # 子列表第三个元素存储对应要渲染的管道图像 pipes.extend([ [screenw+pipe_horizontal_spacing, bottom_pipe_position, pipe_image], [screenw+pipe_horizontal_spacing, bottom_pipe_position-320-pipe_vertical_spacing, pipe_image_flipped]])
2. 修改管道遍历逻辑,先收集待删除元素,遍历完成后再统一删除
# 先收集所有超出屏幕的待删除管道 to_remove = [] for pipe in pipes: if pipe[0] < -52: to_remove.append(pipe) else: pipe[0] -= 2 # 直接读取预存的图像渲染,无需判断索引 screen.blit(pipe[2], (pipe[0], pipe[1])) # 遍历完成后统一删除失效管道 for pipe in to_remove: pipes.remove(pipe)
内容的提问来源于stack exchange,提问作者gavinskycastle
相关产品推荐
相关产品推荐

