2017-02-06 12 views
1

Я пытаюсь объединить несколько узлов спрайтов в единое физическое тело. Например:Объединить несколько физических тел

enter image description here

Я пытаюсь объединить эти три барьера в единый узел спрайтов. Я посмотрел на другие вопросы, и я попытался следующее:

  • Создание один из узлов родителя, добавляя другие узлы к родителю и установка их нединамическим. Однако это отключает движение дочерних узлов.

  • Я попытался создать узел с физикой телом всех других барьеров:

    SKPhysicsBody(bodies: self.allNodePhysicsBodies) 
    
  • Я также попытался создать соединение узлов с «родительским» узлом:

    let joint = SKPhysicsJointFixed.joint(withBodyA: merge[0].physicsBody!, bodyB: merge[1].physicsBody!, anchor: CGPoint(x: 0, y: 0)) 
    let joint1 = SKPhysicsJointFixed.joint(withBodyA: merge[0].physicsBody!, bodyB: merge[2].physicsBody!, anchor: CGPoint(x: 0, y: 0)) 
    
    
    self.physicsWorld.add(joint1) 
    self.physicsWorld.add(joint) 
    

    Однако это не объединяет физические тела. Он не создает единого физического тела.

Как это сделать? Я думал, что мой единственный вариант - объединить текстуры, прежде чем я даже создам узел.

EDIT

Попытка объединить барьеры с физикой тела снова:

let ourUnionOfBodies = SKPhysicsBody(bodies: [merge[0].physicsBody!, merge[1].physicsBody!, merge[2].physicsBody!]) 
    ourUnionOfBodies.isDynamic = true 

    merge[2].physicsBody = ourUnionOfBodies 

ответ

0

Вы могли бы нарисовать барьеры внутри CGMutablePath, а затем использовать это в качестве physicsbody одного узла, хотя это немного длинный работа.

let bodyPath = CGMutablePath() 
bodyPath.move(to: CGPoint(x: ..., y: ...)) // Use move(to:) to “move the pen” somewhere without “drawing” 
bodyPath.addLine(to: CGPoint(x: ..., y: ...)) // Use addLine(to:) to trace a line starting from the “pen”’s last position to the specified CGPoint position 
// ... 
physicsBody = SKPhysicsBody(polygonFrom: bodyPath) 
+0

Но тогда один узел будет иметь тело из трех узлов? В то время как другие двое сохраняют свои отдельные тела. – Pablo

+0

Да, и вы могли бы установить физические тела других 2 узлов на ноль. Единственная часть, которую я не очень хорошо понимаю из вашего вопроса, - это то, какое поведение вы ожидаете от трех барьеров. Предполагая, что вы хотите, чтобы все три барьера могли двигаться вместе, вы могли обновить позиции внешних барьеров (барьеры без физических тел) внутри переопределения func update (...), обратившись к позиции основного узла. Надеясь, что я был ясно в своем ответе, дайте мне знать, если это поможет. – gionti

+0

Хорошо, поэтому вы предлагаете иметь средний с телом, а посторонние без тела, но обновлять свою позицию каждый кадр, чтобы имитировать векторы, получаемые средним узлом? – Pablo

1

init(bodies: [SKPhysicsBody])

Это то, что вам нужно.

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

Я бы допустил ту же ошибку, потому что предположим, что все свойства объединенных тел будут приняты новым телом, особенно если они все одинаковы. Но это не так.

Из документов:

Свойства на детей, например, массы или трения, игнорируются. Используются только формы детских тел.

Итак, создав ваше новое тело из объединения тел в массиве, теперь вам необходимо вручную установить все свойства этого тела по своему желанию/необходимости.

например.

// Putting the right bodies together, correctly 

let ourUnionOfBodies = SKPhysicsBody(bodies: [bodyMine, bodyBeyonce]) 
ourUnionOfBodies.isDynamic = YES! 

// and the result = TWINS! 
+0

Это не сработало, обновил поток, чтобы показать вам мой код – Pablo

+0

Можете ли вы быть немного более подробным, чем «это не сработало ...» @pablo? Ты не даешь мне НИЧЕГО продолжать. – Confused

+0

Прошу прощения за отсутствие подробностей. Поэтому я применил «ourUnionOfBodies» к первому узлу, но он все еще сохранил свое первоначальное тело, он не имеет тела всех трех узлов. Я вложил свой код в свой ответ, внизу, в раздел «Изменить». – Pablo