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

《以撒的结合》式玩家墙体碰撞检测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

逻辑说明:

  1. 先只更新水平坐标,检测碰撞——如果撞墙,就把x回退到移动前的位置,确保水平方向不会穿墙;
  2. 基于水平方向的最终位置,再更新垂直坐标,检测碰撞——如果撞墙,只回退y坐标,此时x已经处于贴墙的正确位置,自然就能实现沿墙滑动的效果;
  3. 不需要额外判断moving_left/moving_right这类状态,因为dx本身已经包含了移动方向的信息(左移时dx为负,右移时为正),只要移动后碰撞就回滚即可。

如果你的detect_collision_with_walls函数需要区分碰撞方向,也可以在回滚后记录当前的碰撞方向避免重复检测,但上面的基础版本已经能解决你当前的锁死问题。

内容的提问来源于stack exchange,提问作者ButterySpirit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:09:57