Почему этот SKPhysicsJointPin не будет хранить эти 2 спрайта вместе?
Я явно не очень хорошо понимаю SKPhysicsJoint, но в Интернете так мало информации, кроме документации Apple, конечно. Что не так с приведенным ниже кодом, который, я думаю, должен держать голову и шею постоянно соединенными - я намерен сделать так, чтобы они действовали как 2 листа бумаги с булавкой, чтобы они могли немного вращаться, а не просто полностью разойтись, Когда я запускаю этот код, они падают на дно сцены, в которой они находятся, ударяются о землю, а затем голова падает с тела.
Может быть, сустав не двигается с ними или что-то, он просто остается на месте, пока они движутся?
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];
4 ответа
Это потому, что вы устанавливаете позицию спрайта после того, как вы установили его свойство PhysicsBody. Я не обнаружил ни одного упоминания об этом в документации, но на прошлых выходных я сломал голову, пытаясь выяснить, почему моя веревка, созданная вручную, работает, а рекурсивно - нет. Положение 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;
}
О, я заметил, вы уже нашли ответ самостоятельно... Не могли бы вы пометить свой вопрос в качестве ответа тогда.
Это кажется правильным.
Палец сустав позволяет оба тела вращаться вокруг точки стыка якоря. Пример реального мира - аналоговые часы. Или велосипедные педали. Или ось колеса автомобиля.
Одна вещь, которую вы должны знать, это то, что тела, соединенные через соединение, не будут сталкиваться друг с другом. Вы можете использовать ограничения штифтового соединения, чтобы не дать головке совершить полный 360-градусный поворот вокруг анкерного штифта.
Итак, я обнаружил, что это настоящая ошибка в Sprite Kit. Исправление состоит в том, чтобы установить позицию спрайта перед настройкой его физики. Я сделал это, и это сработало отлично, как и ожидалось.
Кроме того, не делает недействительным то, что было сказано выше, но, очевидно, физический движок предполагает, что точка привязки сцены остается в (0, 0). Если вы измените его на что-то другое, физический движок все равно будет обрабатывать его как (0, 0).