Pygame左右碰撞tile时被传送到tile顶部,该如何修复?
问题根因
碰撞逻辑处理x轴和y轴的检测时,没有同步rect_temp的坐标:
处理完x方向碰撞、修正了真实rect的坐标后,rect_temp的x坐标仍然停留在碰撞前的偏移状态(和碰撞的tile处于重叠状态),此时直接叠加y轴移动量做碰撞检测,会误判rect_temp和该tile存在y方向重叠,触发y轴碰撞修正逻辑,将角色rect的底部对齐到tile顶部,就出现了左右碰撞后瞬移到tile上方的问题。
修复方案
处理完x轴碰撞后,先把rect_temp的坐标同步为修正后的真实rect的坐标,再处理y轴的移动和碰撞检测,同时可以优化rect_temp的宽高获取逻辑,避免和全局变量耦合。
修复后代码
def collision_test(rect,tiles): hit_list=[] for tile in tiles: if rect.colliderect(tile): hit_list.append(tile) return hit_list def collision_move(rect,movement,tiles): collision_types={"Top":False,"Bottom":False,"Left":False,"Right":False} # 优化:直接用传入rect的宽高,不需要绑定全局atom对象 rect_temp=pygame.Rect(rect.x,rect.y,rect.width,rect.height-1) # 处理x轴碰撞 rect_temp.x+=movement[0] hit_list=collision_test(rect_temp,tiles) for tile in hit_list: if movement[0]>0: rect.right=tile.left collision_types["Right"]=True elif movement[0]<0: rect.left=tile.right collision_types["Left"]=True # 新增:x轴处理完成后同步rect_temp的坐标为修正后的坐标 rect_temp.x = rect.x rect_temp.y = rect.y # 处理y轴碰撞 rect_temp.y+=movement[1] hit_list=collision_test(rect_temp,tiles) for tile in hit_list: if movement[1]>0: rect.bottom=tile.top collision_types["Bottom"]=True elif movement[1]<0: rect.top=tile.bottom collision_types["Top"]=True return rect,collision_types
修改完成后即可解决左右碰撞tile时的瞬移问题:x轴碰撞修正后rect_temp不再和碰撞的tile重叠,y轴检测时不会误判碰撞,也就不会错误触发顶部对齐逻辑。
内容的提问来源于stack exchange,提问作者Dashfast
相关产品推荐
相关产品推荐

