PYGAME重力与墙体碰撞问题:玩家碰撞墙体后rect.y坐标异常降低
碰撞异常问题修复方案
你代码里的问题一共4处,逐一调整就能解决撞墙被弹到墙顶、y坐标异常降低的问题:
- 变量拼写错误
你在__init__方法里定义的离地状态变量是self.in_aire(多了个e),但后续判断跳跃条件时用的是self.in_air,这个变量从未被正确初始化,导致落地判定逻辑完全失效,把初始化代码改成self.in_air = True即可。
- 变量拼写错误
- 重力限制逻辑错误
你写的if self.vel_y > 10: self.vel_y = 0逻辑完全错误,下落速度超过上限直接清零会导致下落动作异常中断,你本来的需求应该是限制最大下落速度为10,改成if self.vel_y > 10: self.vel_y = 10。
- 重力限制逻辑错误
- 碰撞检测逻辑混淆
你把x轴、y轴的碰撞判定放在同一层循环,且只要触发y轴碰撞就会直接修改y轴位移,还把in_air设为False。当玩家水平移动撞墙时,y轴的碰撞判定也会触发,此时如果玩家处于下落状态,代码会直接把玩家位置拉到墙体顶部,这就是你遇到的核心问题。
你需要在触发y轴碰撞后,先判断碰撞是上下方向还是左右方向:只有当碰撞偏移的y轴绝对值大于x轴绝对值时,才判定为上下方向碰撞,再做对应的y轴位移修正;如果是x轴偏移更大,属于左右撞墙,不修改y轴参数。
- 碰撞检测逻辑混淆
- 头部碰撞逻辑错误
你向上跳撞到天花板(tile底部)时,错误把self.in_air设为了False,头部碰撞后玩家还是处于空中,不需要修改in_air状态。
- 头部碰撞逻辑错误
修复后参考代码
GRAVITY = 0.5 class player_jump: def __init__(self): self.jump = False # 修正拼写错误 self.in_air = True self.vel_y = 0 # 原代码缺失rect初始化,自行补充即可 # self.rect = 你的玩家矩形定义 def move_y(self, dx=0): # dx为x轴位移量,可根据你自己的逻辑在方法内初始化计算 dy = 0 if self.jump and not self.in_air: self.vel_y = -11 self.jump = False self.in_air = True # 修正重力上限逻辑 self.vel_y += GRAVITY if self.vel_y > 10: self.vel_y = 10 dy += self.vel_y for tile in world.obstacle_list: # x方向碰撞判定 if tile[1].colliderect(self.rect.x + dx, self.rect.y, self.rect.width, self.rect.height): dx = 0 # y方向碰撞判定 if tile[1].colliderect(self.rect.x, self.rect.y + dy, self.rect.width, self.rect.height): # 计算各方向重叠量,判断碰撞方向 overlap_top = self.rect.bottom - tile[1].top overlap_bottom = tile[1].bottom - self.rect.top overlap_left = self.rect.right - tile[1].left overlap_right = tile[1].right - self.rect.left min_overlap = min(overlap_top, overlap_bottom, overlap_left, overlap_right) if min_overlap == overlap_bottom: # 头部撞到天花板,向上跳场景 self.vel_y = 0 dy = tile[1].bottom - self.rect.top elif min_overlap == overlap_top: # 脚部落到地面,下落场景 self.vel_y = 0 dy = tile[1].top - self.rect.bottom self.in_air = False # 更新玩家坐标 self.rect.x += dx self.rect.y += dy
内容的提问来源于stack exchange,提问作者benny hassan
相关产品推荐
相关产品推荐

