3.8.2
首先看文档描述:

在做基于 SpringJoint2D 的功能。公开可用的有这4个参数。在用 demo 调试效果。
由于文档简洁明了,所以参数功能基本靠猜测和臆想。
所以当调试基于distance的效果时发现奇怪的现象。
你给两个刚体连上SpringJoint2D, 给它的distance 设上初始值,你的设想是两个刚体初始化以后应该保持以这个distance为基准做Spring运动。
经过测试这个功能没问题。
那现在你想动态调整一下这个distance看看什么效果吧,理想中两个刚体会以新的distance 做 Spring运动。用个Slider来控制吧,比较线性,伪代码如下:
let original_distance = 20;
this.springJoint.distance = original_distance;
onSlider(p:number) {
let distance_adjust_ratio = p * 2;
this.springJoint.distance = original_distance * distance_adjust_ratio;
}
这段代码 让SpringJoint 的 distance 以原有 20 为单位,在0 - 2 倍之间变化,即 0 - 40。
当测试这段代码,拖拽 Slider的 handler,你会发现这个 SpingJoint 满天乱飞。
这奇怪的现象不由得让你想,可能是 autoCalcDistance 没有设对,切换一下试试看,
没有一点效果?
你又百思不得解。又要钻进源码看一下,于是:
spring-joint.ts

根本没有 autoCalcDistance 接口,原来如此,难怪没有任何效果。
继续顺着 setDistance() 找到 b2.DistanceJoint 找到 SetLength() ,看进去,关键变量 m_length :
对他的使用有两处,分别在:
InitVelocityConstraints()
SolvePositionConstraints()
它们对 m_length 都是作为增量来使用。
因此 distance 的真正含义是:
你每次设置这个值,会以该值为相对量进行加法运算。
所以,你想要设定两个关节间距离,比如从 20 变为 25,你需要这样:
开始在SpringJoint 没有enable 的状态下(或者node 为 非 active)(踩过坑,如果你没有这样操作就会飞走),设定distance 为 20,
然后随着Slider的progress,你每次要把 distance 变成一点点 增量, 比如
springJoint.distance = 0.1;
然后关节间距离就会 +0.1,而不是20.1,那样会变成 20 + 20.1 = 40.1
这就是为什么你按照字面意思 设定 distance 会飞走的原因。
这可能是 box2d 原有的机制
问题是,大大能不能把文档搞清楚一些啊,求求了。
文档不清楚也可以,这个 distance 改个名字也让开发者好猜一些,求求了,叫个 incremental_distance, 或者 increment 什么的。
每次出新问题,先怀疑半天自己,然后找半天源码,看半天逻辑,然后发现,哦,原来这个原因,
每天和编辑器作斗争,真的很累。