因此,我创建了一个SKSpriteNodes环,这些环实际上是使用销钉连接在一起的矩形。我想将此环挂在SKShapeNode圆内。我已经使用SKPhysicsJointLimit将每个节点连接到SKShapeNode。
一切正常,如果将maxLength设置为“主观上”的“正确”数字,我将获得想要的效果。
我已经将所有极限关节存储在Array中,因此我可以轻松访问,并将它们添加到PhysicalWorld中。
所有这些工作都能正常运行,并且符合预期,尽管花了一些时间才能使代码正确。这些东西很挑剔!
现在,我真正想做的是将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];
但这根本什么也没做。
我终于意识到,将关节添加到PhysicalWorld后,您似乎无法更改其属性。因此,我在场景的更新方法中尝试了类似的方法:
[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'
即使我已经清楚地删除了它。所以,我真的不知道从这里出发。有关关节的文档以及互联网上的现有材料非常薄。我想接下来要尝试的是删除所有关节并添加它们,但这将是一个巨大的痛苦。
任何想法都将非常有帮助!
最佳答案
正如OP所指出的,在进行更改之前,必须从物理世界中移除关节。下面为我工作。
for joint in joints
{
physicsWorld.removeJoint(joint)
joint.maxLength = yourNewValue
physicsWorld.addJoint(joint)
}