[LayaAirIDE 2.0]2.0 beta3 物理 DestroyJoint 报错

下载的最新的LayaAir IDE 2.0.0 beta3
使用的TS为编程语言
 
创建了两个Scene
在第一个场景里面添加了两个Sprite
并且在IDE中分别对其添加上RigidBody
 
然后用Laya.Scene.open("XXX.scene");进行场景跳转 
没有问题
 
但是如果在第一个场景里面的一个物体添加了任意Joint
把Joint设置正确 链接好两个物体
确保Joint没有设置错误
 
这时候再使用Laya.Scene.open("XXX.scene");进行场景跳转
会在DestroyJoint这个地方报错:
 
Uncaught Error
    at Object.box2d.b2Assert (laya.physics.js:38)
    at box2d.b2World.DestroyJoint (laya.physics.js:793)
    at Physics.__proto._removeJoint (laya.physics.js:2242)
    at DistanceJoint.__proto._onDisable (laya.physics.js:1716)
    at DistanceJoint.__proto._setActive (laya.core.js:730)
    at Sprite.__proto._inActiveHierarchy (laya.core.js:13627)
    at Scene_1_UI.__proto._inActiveHierarchy (laya.core.js:13632)
    at Scene_1_UI.__proto._onRemoved (laya.core.js:13655)
    at Scene_1_UI.__proto._setParent (laya.core.js:13372)
    at Scene_1_UI.__proto._setParent (laya.core.js:18327)
 
如果手动尝试删除Joint
报错:
 
Uncaught TypeError: Cannot read property 'SetAwake' of undefined
    at box2d.b2World.DestroyJoint (laya.physics.js:792)
    at Physics.__proto._removeJoint (laya.physics.js:2242)
    at Scene_1_UI.ts:18
 
我是Laya新手,不知道是我哪里设置没对,还是使用方法不对,还是其他原因。
官方文档翻遍了没有找到解决方法,Laya这次集成的Box2d好多方法又没有表露出来,无法按照Box2d原本的方式清除物理引擎内容。
 
所以我想问下
 
1、scene里面有带有物理组件的物体在场景切换时该如何处理呢?
 
2、是否可以多提供一些Box2d的方法呢,比如最基础的world.getBodyList()用于遍历物体列表的功能等等。
 
 
 
 
 
 
已邀请:

ave

赞同来自: wssw

我自己通过修改laya.physics.js暂时把问题解决了
方法是:
找到box2d.b2World.prototype.DestroyJoint
在下面两行代码之前添加this.m_jointCount判断
box2d.ENABLE_ASSERTS && box2d.b2Assert(0 < this.m_jointCount);
--this.m_jointCount;
 
完整代码如下:
box2d.b2World.prototype.DestroyJoint = function(a) {
    box2d.ENABLE_ASSERTS && box2d.b2Assert(!this.IsLocked());
    if (!this.IsLocked()) {
        var b = a.m_collideConnected;
        a.m_prev && (a.m_prev.m_next = a.m_next);
        a.m_next && (a.m_next.m_prev = a.m_prev);
        a === this.m_jointList && (this.m_jointList = a.m_next);
        var c = a.m_bodyA,
            d = a.m_bodyB;
        c && c.SetAwake(!0);
        d && d.SetAwake(!0);
        a.m_edgeA && a.m_edgeA.prev && (a.m_edgeA.prev.next = a.m_edgeA.next);
        a.m_edgeA && a.m_edgeA.next && (a.m_edgeA.next.prev = a.m_edgeA.prev);
        c && a.m_edgeA === c.m_jointList && (c.m_jointList = a.m_edgeA.next);
        a.m_edgeA && (a.m_edgeA.prev = null);
        a.m_edgeA && (a.m_edgeA.next = null);
        a.m_edgeB && a.m_edgeB.prev && (a.m_edgeB.prev.next = a.m_edgeB.next);
        a.m_edgeB && a.m_edgeB.next && (a.m_edgeB.next.prev = a.m_edgeB.prev);
        d && a.m_edgeB === d.m_jointList && (d.m_jointList = a.m_edgeB.next);
        a.m_edgeB && (a.m_edgeB.prev = null);
        a.m_edgeB && (a.m_edgeB.next = null);
        box2d.b2JointFactory.Destroy(a, null);
        if(this.m_jointCount>0){
            box2d.ENABLE_ASSERTS && box2d.b2Assert(0 < this.m_jointCount);
            --this.m_jointCount;
        }
        if (d && !b)
            for (a = d.GetContactList(); a;) a.other === c && a.contact.FlagForFiltering(), a = a.next
    }
};
毕竟是自己没看懂全部内容的情况下修改的
暂时没有发现其他问题
但是不保证会引发其他问题
所以还是希望官方能尽早修复这个问题
 
 

StevenMiao

赞同来自:

过了这么久竟然还没修复,谢谢上面的回复了!

要回复问题请先

商务合作
商务合作