1

SKPhysicsJointLimit を使用して、シーン内で 2 つの SKSpriteNode を接続しようとしています。一方のノードは物理シミュレーションの影響を受けず、もう一方のノードは影響を受けます。これにより、振り子の動きが発生するはずです。ただし、SKPhysicsJointLimit を使用してノードを接続すると、3 つのアンカー ポイントが作成されるように見えます。

ここで見ることができますhttp://imgur.com/a/hQqVP緑のノードは物理シミュレーションの影響を受けません。

// set scene up
self.anchorPoint = CGPointMake(0.5, 0.5);
self.backgroundColor = [SKColor grayColor];
self.view.showsPhysics = YES;


// set up the two bodies to be connected
SKSpriteNode* testSpriteOne = [[SKSpriteNode alloc] initWithColor:[SKColor yellowColor] size:NODE_SIZE];
testSpriteOne.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:NODE_SIZE];
testSpriteOne.position = CGPointMake(-20, -10);
testSpriteOne.physicsBody.dynamic = YES;

[self addChild:testSpriteOne];

SKSpriteNode* testSpriteTwo = [[SKSpriteNode alloc] initWithColor:[SKColor greenColor] size:NODE_SIZE];
testSpriteTwo.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:NODE_SIZE];
testSpriteTwo.position = CGPointMake(93, 166);
testSpriteTwo.physicsBody.dynamic = NO;

[self addChild:testSpriteTwo];

// set up the joint
SKPhysicsJointLimit* ropeJoint = [SKPhysicsJointLimit jointWithBodyA:testSpriteTwo.physicsBody bodyB:testSpriteOne.physicsBody anchorA:testSpriteTwo.position anchorB:testSpriteOne.position];

[self.physicsWorld addJoint:ropeJoint];

シーンのアンカー ポイントは (0.5, 0.5) ですが、(0, 0) に設定すると物理シミュレーションは機能しますが、正しい位置にありません。もう 1 つの回避策は、スケールされたシーンの幅と高さによってオフセットされる一時的な代替位置を作成し、それらをジョイントの作成に使用することです。以下のコードはこれを示しています。

// works with offset
CGPoint AlternatePosition1 = CGPointMake(testSpriteOne.position.x + self.scene.size.width * self.scene.anchorPoint.x, testSpriteOne.position.y + self.scene.size.height * self.scene.anchorPoint.y);
CGPoint AlternatePosition2 = CGPointMake(testSpriteTwo.position.x + self.scene.size.width * self.scene.anchorPoint.x, testSpriteTwo.position.y + self.scene.size.height * self.scene.anchorPoint.y);
SKPhysicsJointLimit* ropeJoint = [SKPhysicsJointLimit jointWithBodyA:testSpriteOne.physicsBody bodyB:testSpriteTwo.physicsBody anchorA:AlternatePosition1 anchorB:AlternatePosition2];

まず、なぜこれが機能するのかわかりません。結果のポイントはシーン座標にありません。また、たとえばスプライトがワールド ノードに含まれていて、ワールド ノードがシーン内で位置を変更している場合、この「解決策」は機能しません。シーン内のノードの位置が SKPhysicsJoint で使用されている場合でも。

したがって、ノードの位置をオフセットすることなく、アンカーが (0.5,0.5) のシーンで SKPhysicsJointLimit を適切に機能させる方法はありますか。

4

0 に答える 0