Почему этот SKPhysicsJointPin не сохранит эти 2 спрайта?

Я четко не понимаю SKPhysicsJoint очень хорошо, но в Интернете пока мало информации, кроме документов Apple, конечно. Что не так со следующим кодом, который, как я думаю, должен поддерживать постоянную связь между головой и шеей, – я предполагаю, что они действуют как 2 шт бумаги с булавкой, так что они могут немного вращаться, но не просто полностью расходятся , Когда я запускаю этот код, они падают на дно SKScene, в котором они находятся, ударяются о землю, затем голова падает с тела.

Может быть, сустав не двигается С ними или чем-то, он просто остается на месте, пока они двигаются?

self.head = [SKSpriteNode spriteNodeWithImageNamed:@"head.png"]; self.head.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.head.size]; self.head.physicsBody.mass = 0.05; self.head.physicsBody.dynamic = YES; self.chest = [SKSpriteNode spriteNodeWithImageNamed:@"chest_neck"]; self.chest.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.chest.size]; self.chest.physicsBody.mass = 0.05; self.chest.physicsBody.dynamic = YES; self.leftLeg = [SKSpriteNode spriteNodeWithImageNamed:@"left_leg"]; self.leftLeg.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.leftLeg.size]; self.leftLeg.physicsBody.mass = 10; self.leftLeg.physicsBody.dynamic = YES; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { self.head.position = CGPointMake(282, 220); self.chest.position = CGPointMake(282, 130); self.leftLeg.position = CGPointMake(282, 10); } else { self.head.position = CGPointMake(512, 380); self.chest.position = CGPointMake(512, 290); self.leftLeg.position = CGPointMake(512, 10); } [self addChild:self.head]; [self addChild:self.chest]; [self addChild:self.leftLeg]; self.chestJointPinAnchor = CGPointMake(self.chest.position.x, self.chest.position.y+39); self.chestJointPin = [SKPhysicsJointPin jointWithBodyA:self.head.physicsBody bodyB:self.chest.physicsBody anchor:self.chestJointPinAnchor]; [self.physicsWorld addJoint:self.chestJointPin]; 

Это связано с тем, что вы установили положение спрайта после того, как вы установили его свойство physicalBody. Я не обнаружил упоминания об этом в документации, но в прошлый уик-энд я сломал голову, пытаясь понять, почему работает моя ручная работа, но рекурсивно это не так. Позиция SpriteNodes ДОЛЖНА быть установлена перед физикой. Итак, просто измените порядок своего кода так или иначе:

 self.head = [SKSpriteNode spriteNodeWithImageNamed:@"head.png"]; self.chest = [SKSpriteNode spriteNodeWithImageNamed:@"chest_neck"]; self.leftLeg = [SKSpriteNode spriteNodeWithImageNamed:@"left_leg"]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { self.head.position = CGPointMake(282, 220); self.chest.position = CGPointMake(282, 130); self.leftLeg.position = CGPointMake(282, 10); } else { self.head.position = CGPointMake(512, 380); self.chest.position = CGPointMake(512, 290); self.leftLeg.position = CGPointMake(512, 10); self.head.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.head.size]; self.head.physicsBody.mass = 0.05; self.head.physicsBody.dynamic = YES; self.chest.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.chest.size]; self.chest.physicsBody.mass = 0.05; self.chest.physicsBody.dynamic = YES; self.leftLeg.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.leftLeg.size]; self.leftLeg.physicsBody.mass = 10; self.leftLeg.physicsBody.dynamic = YES; } 

О, я заметил, вы уже нашли ответ самостоятельно … Не могли бы вы пометить свой вопрос, как ответили тогда.

Это кажется правильным.

Палец сустав позволяет оба тела вращаться вокруг точки стыка якоря. Пример реального мира – аналоговые часы. Или велосипедные педали. Или ось колеса колеса.

Одна вещь, которую вы должны знать, это то, что тела, соединенные через сустав, не будут сталкиваться друг с другом. Вы можете использовать ограничения на штыревые соединения, но не позволяйте головке полностью вращаться вокруг штыревого якоря.

Хорошо, поэтому я узнал, что это настоящая ошибка в Sprite Kit. Исправление состоит в том, чтобы установить положение спрайта перед установкой его физического объекта. Я сделал это, и он работал отлично, как и ожидалось.

Кроме того, не признавая недействительным то, что было сказано выше, но, по-видимому, физический движок предполагает, что привязка точки сцены остается на (0, 0). Если вы измените его на что-то еще, физический движок по-прежнему будет рассматривать его как (0, 0).

  • Обрезка SKTexture с текстом SKLabel
  • iOS - bodyWithPolygonFromPath: Тело такое же, как и путь, но столкновение не работает должным образом
  • SpriteKit: как вызвать функцию в SKAction.sequence?
  • Перемещение камеры в SpriteKit
  • Невозможно добавить собственный шрифт в Xcode
  • Специфический атлас с комплектом Sprite взорван на iPad
  • Преобразование координат UIKit в координаты SpriteKit
  • UIVisualEffectView не размывает его просмотр SKView
  • Звук AVAudioPlayer не воспроизводится
  • Sprite Kit iOS 7 - как добавить тень к SKSpriteNode?
  • Как визуализировать множество узлов SpriteKit сразу?
  • Давайте будем гением компьютера.