如何在pygame中对列表内对象按属性排序后blit绘制到屏幕
问题定位与修复方案
核心问题
你仅对drawn_lines列表内的Line对象按height属性完成了排序,但没有更新每个Line对象的rect.x坐标:所有线条的x位置还是生成时分配的初始值,所以不管列表顺序怎么变,绘制出来的视觉顺序都和生成时一致。
修复步骤
- 排序完成后遍历列表,按新的顺序重新给每个Line对象分配x坐标
- 重置线条(按左方向键)时,同步重置
is_sorted标记位,避免新生成的未排序线条依然走排序后绘制逻辑 - 可删除冗余的
draw_sorted函数,它和draw_lines逻辑完全一致,只需要保留一个绘制函数即可
修改后的关键代码片段
首先修改sort函数:
def sort(): """按高度排序列表并更新线条x坐标""" # 按height属性排序,若需要从高到矮显示可添加 reverse=True 参数 drawn_lines.sort(key=operator.attrgetter('height')) # 重新分配每个线条的x坐标 current_x = 0 for line in drawn_lines: line.rect.x = current_x current_x += line_width
然后修改主循环中左方向键的事件处理逻辑:
if event.key == pygame.K_LEFT: redraw_lines() is_sorted = False # 重置排序标记,新生成的线条为未排序状态
最后可以把主循环里的绘制逻辑简化,不用区分排序状态:
# 原来的if-else可以直接替换为一行 draw_lines()
额外说明
你的height属性取值范围是[-400, 0],数值越小(越接近-400)对应的实际线条高度越高,如果需要排序后从左到右高度从低到高,保持当前排序逻辑即可;如果需要从高到低,给sort方法加reverse=True参数即可。
内容的提问来源于stack exchange,提问作者TheProGrammar
相关产品推荐
相关产品推荐

