因此,我创建了一个 SKSpriteNode 环,它们本质上是使用销接头连接在一起的矩形。我想将此环悬挂在 SKShapeNode 圆圈内。我已经使用 SKPhysicsJointLimit 将每个节点连接到 SKShapeNode。
这一切都很好,如果我将 maxLength 设置为我主观确定的“正确”数字,我就会得到我正在寻找的效果。
我已经将所有的限制关节存储在一个数组中,这样我就可以轻松访问,并且我已经将它们添加到了物理世界中。
所有这些都按预期正常工作,尽管需要一些工作才能使代码正确。这些东西很挑剔!
现在,我真正想做的是将 maxLength 设置为某个较大的数字,然后随着时间的推移逐渐减少该数字,以便戒指从“松散悬挂”变为“拉紧”
我尝试了多种方法——似乎都没有。首先,我试过:
SKAction *tighten = [SKAction customActionWithDuration:1 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
CGFloat t = elapsedTime/duration;
CGFloat p = t*t;
CGFloat newLimit = fromLimit*(1-p) + toLimit*p;
for (int i = 0; i < _connectors.count; i++){
[[_connectors objectAtIndex:i] setMaxLength:newLimit];
}
}];
[_ring runAction:tighten];
但这根本没有做任何事情。
我终于意识到,在将关节添加到物理世界后,您似乎无法更改关节的属性。所以,我在场景的更新方法中尝试了这样的事情:
[scene.physicsWorld removeJoint:[_connectors objectAtIndex:i]];
[[_connectors objectAtIndex:i] setMaxLength:newLimit];
[scene.physicsWorld addJoint:[_connectors objectAtIndex:i]];
但是,这也不起作用。它抛出了错误:
'Cant add joint <PKPhysicsJointRope: 0x114e84350>, already exists in a world'
即使我已经清楚地删除了它。所以,我真的不知道从这里去哪里。互联网上关于关节的文档和现有材料非常薄。我想接下来我会尝试移除所有关节并添加它们,但这将是一个巨大的痛苦。
任何想法都会非常有帮助!