SKPhysicsJointLimit создает три опорные точки в сцене

Я пытаюсь соединить два узла SKSpriteNode в сцене с помощью SKPhysicsJointLimit. Один узел не подвержен физическому моделированию, а другой. Это должно привести к движению маятника. Однако, когда SKPhysicsJointLimit используется для соединения узлов, создается три точки привязки.

На 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), физическое моделирование работает, но не в правильном положении. Другим обходным решением является создание временных альтернативных положений, которые смещены на масштабированную ширину и высоту сцены, и их использование при создании соединения. Код ниже показывает это.

// 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.

Итак, есть ли способ, чтобы SKPhysicsJointLimit функционировал должным образом в сцене с якорем (0.5,0.5) без необходимости смещать положение узлов.

0 ответов

Другие вопросы по тегам