范例 collider/Platform 里面没看明白,求大神解答一下

范例 collider/Platform 里面 有些代码 没看懂
希望 有大神可以解释一下

在这个方法里面
onCollisionEnter: function(){
//从76行开始——到87行结束,不知道 这个是啥意思啊,求大神指导

    var otherAabb = other.world.aabb;
    var otherPreAabb = other.world.preAabb.clone();

    var selfAabb = self.world.aabb;
    var selfPreAabb = self.world.preAabb.clone();

    // 2nd step
    // forward x-axis, check whether collision on x-axis
    selfPreAabb.x = selfAabb.x;
    otherPreAabb.x = otherAabb.x;


   //89行开始,到——102行结束,也是不知道 啥意思,真心希望 注释 完备一点啊

    if (cc.Intersection.rectRect(selfPreAabb, otherPreAabb)) {
        if (this.speed.x < 0 && (selfPreAabb.xMax > otherPreAabb.xMax)) {
            this.node.x = otherPreAabb.xMax - this.node.parent.x;
            this.collisionX = -1;
        }
        else if (this.speed.x > 0 && (selfPreAabb.xMin < otherPreAabb.xMin)) {
            this.node.x = otherPreAabb.xMin - selfPreAabb.width - this.node.parent.x;
            this.collisionX = 1;
        }

        this.speed.x = 0;
        other.touchingX = true;
        return;
    }

   //从104开始 到——122结束 求 指导

    // 3rd step
    // forward y-axis, check whether collision on y-axis
    selfPreAabb.y = selfAabb.y;
    otherPreAabb.y = otherAabb.y;

    if (cc.Intersection.rectRect(selfPreAabb, otherPreAabb)) {
        if (this.speed.y < 0 && (selfPreAabb.yMax > otherPreAabb.yMax)) {
            this.node.y = otherPreAabb.yMax - this.node.parent.y;
            this.jumping = false;
            this.collisionY = -1;
        }
        else if (this.speed.y > 0 && (selfPreAabb.yMin < otherPreAabb.yMin)) {
            this.node.y = otherPreAabb.yMin - selfPreAabb.height - this.node.parent.y;
            this.collisionY = 1;
        }
        
        this.speed.y = 0;
        other.touchingY = true;
    }  

}

有没有大神啊?求指导啊!

aabb是这样一个正方形 它不随节点旋转 并且永远刚刚好包围节点 想像一下 假设节点也是一个正方形 节点旋转45度 此时aabb的宽度将是节点的对角线距离
回过头来 不看代码 在设计思路上考虑如何进行墙壁碰撞

我们手头的工具有
A: 两个碰撞组件相撞时 我们可以拿到回调
B:回调中可以拿到碰撞双方的aabb

此时的状态为: 我们自己身体一部分嵌入到墙里了。
我们的目标是: 将身体从墙里抽出来 并停在墙边

请用手头的工具 依据目前的状态 得到结果。

很简单 计算两个aabb重叠的部分 然后加到自己的位置上就出墙了。

如果你这么写了 就会发现一个问题
如果你往桌角去撞
比如桌子的右下角
这时你无法知道 应该出墙的位置是往下出墙 还是往右出墙 所以 得给我们自身设置移动的速度方向 让代码可以做到你从哪撞来 回到哪去。这就是speed属性的作用

如果你做了这个修复 还会发现另一个问题
如果你不断往墙同一位置撞 你会发现你在那跳起了尬舞。
因为碰撞组件的移动会比节点的移动慢上一帧 所以在撞墙回调触发前 人已经进墙了
所以就会疯狂进墙出墙。

一个简单的修复方法就是
在第一次碰撞进入的时候 就设置标志位 告诉他 此路不通 然后在update移动的时候 就通过这个标志位来判断是否能往墙那边走
同样的 在碰撞离开后 解除这个标志位 这就是collisionX touchX的作用

应该是这样 platform的代码我只看过一点点

1赞

在 onCollisionEnter(){} 里面
一些 参数都没搞懂啊

   // 1st step 
    // get pre aabb, go back before collision
    var otherAabb = other.world.aabb;
    var otherPreAabb = other.world.preAabb.clone();

    var selfAabb = self.world.aabb;
    var selfPreAabb = self.world.preAabb.clone();

    // 2nd step
    // forward x-axis, check whether collision on x-axis
    selfPreAabb.x = selfAabb.x;
    otherPreAabb.x = otherAabb.x;

这些是啥意思呢?

aabb就是当前位置的碰撞包围盒
preAabb就是碰撞进入那一刻的碰撞包围盒

selfPreAabb.x = selfAabb.x;
otherPreAabb.x = otherAabb.x;

嗯,我就是这句没看懂

大兄弟,用speed判断方向,那selfPreAabb.xMax > otherPreAabb.xMax) 这个条件干嘛的啊