Спрайт-кит - один узел с двумя физическими корпусами
Это возможно для одного узла, имеющего два пути физического тела? как это сделать? Я хочу создать узел, имеющий два (окружности) физического тела по сторонам узла.
Если это невозможно, есть ли какие-то хитрости для этого? Спасибо
3 ответа
Вы хотите использовать [SKPhysicsBody bodyWithBodies:...]
, Из документов:
Формы физических тел, переданные этому методу, используются для создания нового физического тела, чья покрытая область представляет собой объединение областей его дочерних элементов. Эти области не должны быть смежными. Если между двумя частями есть пространство, другие тела могут проходить между этими частями. Тем не менее, физическое тело рассматривается как одно связное тело, что означает, что сила или импульс, приложенные к телу, воздействуют на все части, как если бы они были скреплены неразрушимым каркасом.
Это будет выглядеть примерно так:
SKPhysicsBody *leftCircle = [SKPhysicsBody bodyWithCircleOfRadius:leftCircleRadius center:leftCircleCenter];
SKPhysicsBody *rightCircle = [SKPhysicsBody bodyWithCircleOfRadius:rightCircleRadius center:rightCircleCenter];
node.physicsBody = [SKPhysicsBody bodyWithBodies:@[leftCircle, rightCircle]];
Вот пример того, как подключиться к узлам спрайтов, используя SKPhysicsJointFixed. Сначала создайте два спрайта:
SKSpriteNode *sprite1 = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(64, 64)];
// position must be set before creating physics body to avoid bug in iOS 7.0.x
sprite1.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame));
sprite1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite1.size];
sprite1.physicsBody.restitution = 1.0;
[self addChild:sprite1];
SKSpriteNode *sprite2 = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(64, 64)];
sprite2.position = CGPointMake(CGRectGetMidX(self.frame)-sprite2.size.width*2,
CGRectGetMidY(self.frame));
sprite2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite2.size];
sprite2.physicsBody.restitution = 1.0;
[self addChild:sprite2];
затем подключите узлы, вызвав этот метод:
[self connectNode1:sprite1 toNode2:sprite2];
Этот метод объединяет два узла в их средней точке. Обратите внимание, что оба физических тела должны быть в сцене до вызова этого метода.
- (void) connectNode1:(SKSpriteNode *)node1 toNode2:(SKSpriteNode *)node2
{
CGPoint midPoint = CGPointMake((node1.position.x + node2.position.x)/2,
(node1.position.y + node2.position.y)/2);
SKPhysicsJointFixed *joint = [SKPhysicsJointFixed jointWithBodyA:node1.physicsBody
bodyB:node2.physicsBody
anchor:midPoint];
[self.physicsWorld addJoint:joint];
}
Вот простой способ добиться желаемого поведения:
Как обнаружить контакт на разных участках физического тела
//Create SpriteNode1 & physicsBody
//Create SpriteNode2 & physicsBody
[SpriteNode1 addChild: SpriteNode2]
Вы можете расположить SpriteNode2 относительно SpriteNode1. Любое движение и т. Д., Выполняемые на SpriteNode1, также будут перемещать SpriteNode2.
Задавать: SpriteNode2.PhysicsBody.Dynamic=NO;
Вы также можете создать SpriteNode, который действует как основной объект, и добавить SN1 и SN2 в качестве дочерних, если вам будет проще.