4

因此,我创建了一个 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'

即使我已经清楚地删除了它。所以,我真的不知道从这里去哪里。互联网上关于关节的文档和现有材料非常薄。我想接下来我会尝试移除所有关节并添加它们,但这将是一个巨大的痛苦。

任何想法都会非常有帮助!

4

1 回答 1

1

正如 OP 所指出的,在应用更改之前,关节似乎必须从物理世界中移除。以下对我有用。

for joint in joints
{
    physicsWorld.removeJoint(joint)
    joint.maxLength = yourNewValue
    physicsWorld.addJoint(joint)
}
于 2016-05-04T07:34:47.600 回答