You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:39:00