[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()用于遍历物体列表的功能等等。
使用的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()用于遍历物体列表的功能等等。
没有找到相关结果
已邀请:
要回复问题请先登录
2 个回复
ave
赞同来自: wssw
方法是:
找到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
赞同来自: