Почему этот 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).

  • Физические тела не реагируют на настройки битмаски
  • UIVisualEffectView не размывает его просмотр SKView
  • Как ограничить кран мяча в Swift 3 / SpriteKit?
  • Многострочная этикетка в быстром 2 комплекте спрайтов?
  • Как создать CGPath из SKSpriteNode в SWIFT
  • Добавить светящийся эффект в SKSpriteNode
  • Где я могу найти комплект Sprite Доступные шрифты?
  • Game Engine Collison Bitmask ... Почему 0x01 и т. Д.?
  • Сохранение сгенерированной SKTexture в файл
  • Как создать несколько спрайтов (узлов) с той же текстурой, которые будут автоматически генерировать новое при удалении одного узла?
  • Как я могу сделать пересечение двух SKSpriteNodes прозрачными
  • Interesting Posts

    UISearchDisplayController с displaySearchBarInNavigationBar толкает представление результата вниз с помощью navigationBar.translucent = false

    UILabel Выровнять текст в центр

    Измените User-Agent и удалите имя приложения и значение по умолчанию iOS

    Приложение iOS Случается случайным образом после интеграции revmob

    Как получить возвращаемое значение из блока завершения?

    React-Native: невозможно получить доступ к значениям состояния или любым способом, объявленным из renderRow

    Отправка данных о получении покупки приложения на моем сервере

    AVMutableComposition поворачивает видео

    Хорошая практика для устранения неоднозначности имен аргументов по сравнению с именами переменных экземпляра в Objective-C

    Как настроить высоту заголовка таблицы в swift?

    UITabBar selectionIndicatorImage height на iPhone X

    Общественный чат с радиусом с использованием Firebase (запрошенные предложения)

    Переходы навигационных переходов UICollectionViewController

    Swift AVAudioEngine crash: игрок запускается, когда в отключенном состоянии

    Предупреждения Xcode UITest push уведомления не могут нажать «Разрешить»,

    Давайте будем гением компьютера.