以下代码效果很好。它创建了一根由方形链节制成的悬挂绳索,然后对底部链节施加力使其摆动。它在创建 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)];