1

以下代码效果很好。它创建了一根由方形链节制成的悬挂绳索,然后对底部链节施加力使其摆动。它在创建 SKScene 时在 SKScene 对象中执行。

但是,如果您将最后一行的力从 2000 更改为 4000,物理就会失控,链接有时会断开。有时链接似乎在振动,或者它们会完全屈服于重力,就好像没有关节一样。此外,如果您有其他物理实体,它们将不再与铁丝链发生碰撞,即使它们在施加力之前发生了碰撞。

尽管 4000 似乎过多,但我遇到过这个问题,对较轻的物体施加的力要小得多,或者对绳索施加的力较小,链接之间的间隙较小。

难道我做错了什么?Sprite Kit 中是否存在错误或其他解释?我在网上找不到任何答案。

无论是在创建 SKScene 期间施加力还是延迟到稍后再施加力也无关紧要。

self.scaleMode = SKSceneScaleModeAspectFit;
self.anchorPoint = CGPointMake(0.5, 0.5);

CGFloat length = 20;
CGFloat gapMult = 1.8;
int numBoxes = 10;

SKSpriteNode *prevBox = nil;
for (int i = 0; i < numBoxes; i++) {
    SKSpriteNode *box = [SKSpriteNode spriteNodeWithColor:[UIColor yellowColor] size:CGSizeMake(length, length)];
    box.position = CGPointMake(0, -i * length * gapMult);
    [self addChild:box];

    box.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(length, length)];
    if (i == 0) {
        box.physicsBody.dynamic = NO;
    } else {
        CGPoint pt1 = CGPointMake(0, prevBox.position.y - length / 2);
        CGPoint pt2 = CGPointMake(0, box.position.y + length / 2);

        SKPhysicsJointLimit *joint = [SKPhysicsJointLimit jointWithBodyA:prevBox.physicsBody bodyB:box.physicsBody anchorA:pt1 anchorB:pt2];
        [self.physicsWorld addJoint:joint];
    }

    prevBox = box;
}

[prevBox.physicsBody applyForce:CGVectorMake(2000, 0)];
4

0 回答 0