《以撒的结合》式玩家墙体碰撞检测if语句冲突问题
解决《以撒的结合》风格的墙体碰撞滑动问题
你的问题核心在于同时更新x和y坐标后再做碰撞检测,导致水平和垂直方向的碰撞处理互相干扰——当两个方向同时撞墙时,会先后把x和y都回滚到初始位置,直接锁死玩家。
正确的思路是把水平和垂直方向的移动、碰撞检测完全分开处理:先单独处理水平移动,确认无碰撞后再处理垂直移动,这样两个方向的碰撞逻辑不会互相影响,自然实现贴墙滑动的效果。
修改后的代码如下:
def update(self, dt): prev_x = self.x prev_y = self.y # 先处理水平方向移动与碰撞 self.world_x += dx self.x += dx # 检测水平移动后的碰撞,如果碰撞就回滚x坐标 if self.detect_collision_with_walls(self.walls_layer): self.x = prev_x self.world_x = self.x # 再处理垂直方向移动与碰撞 self.world_y += dy self.y += dy # 检测垂直移动后的碰撞,如果碰撞就回滚y坐标 if self.detect_collision_with_walls(self.walls_layer): self.y = prev_y self.world_y = self.y
逻辑说明:
- 先只更新水平坐标,检测碰撞——如果撞墙,就把x回退到移动前的位置,确保水平方向不会穿墙;
- 基于水平方向的最终位置,再更新垂直坐标,检测碰撞——如果撞墙,只回退y坐标,此时x已经处于贴墙的正确位置,自然就能实现沿墙滑动的效果;
- 不需要额外判断
moving_left/moving_right这类状态,因为dx本身已经包含了移动方向的信息(左移时dx为负,右移时为正),只要移动后碰撞就回滚即可。
如果你的detect_collision_with_walls函数需要区分碰撞方向,也可以在回滚后记录当前的碰撞方向避免重复检测,但上面的基础版本已经能解决你当前的锁死问题。
内容的提问来源于stack exchange,提问作者ButterySpirit
相关产品推荐
相关产品推荐

