2015-07-27 4 views
3

я в настоящее время работает над игрой, где у меня есть изображение вида цилиндрического объекта, и я делаю SKPhysicsBody со следующим:SKPhysicsBody Изменение центра масс

self.oval.node.physicsBody = SKPhysicsBody(texture: self.oval.node.texture, size: self.oval.node.size) 

Этот метод создает хорошую форму вокруг узел, однако, центр тяжести уходит ... Он балансирует на кончике овала. Есть ли способ изменить это так, чтобы он уравновешивался, где должна быть теоретически самая тяжелая часть? Благодаря!

+1

Если вы установите 'skView.showsPhysics = true' в контроллере вида, вы увидите схему физических тел в сцене. Это полезно для отладки проблем физического тела. Также вы изменили опорную точку спрайта? – 0x141E

+2

@ 0x141E форма тела не является проблемой. Тело прекрасно окружает картину, которую я использую; однако, когда картина приземляется на землю, она балансирует на своей стороне, а не там, где должна находиться основная масса. – Kendel

ответ

4

Центр масс не может быть удален, это точно. Проблема в том, что вы хотите, чтобы ваше физическое тело обладало неравномерной плотностью. Плотность тела жесткой физики однородна повсюду. Я не вижу способа сделать это, кроме изменения самого физического тела (т. Е. Изменения размера/формы тела физики).

Даже если вы попытаетесь создать физическое тело из объединения нескольких физических тел с использованием SKPhysicsBody(bodies: [body1,body2]), плотность будет по-прежнему однородной, потому что Sprite Kit по-прежнему будет имитировать это как одно тело.

Единственное решение, о котором я могу думать, состоит в том, чтобы сплавить 2, используя соединение, как показано ниже.

class GameScene: SKScene { 
    override func didMoveToView(view: SKView) { 
     let node1 = SKShapeNode(circleOfRadius: 20) 
     node1.physicsBody = SKPhysicsBody(circleOfRadius: 20) 
     node1.position = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0) 

     let node2 = SKShapeNode(circleOfRadius: 2) 
     node2.physicsBody = SKPhysicsBody(circleOfRadius: 1) 
     node2.position = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0+19) 
     node2.physicsBody!.mass = node1.physicsBody!.mass * 0.2 //Set body2 mass as a ratio of body1 mass. 

     self.addChild(node1) 
     self.addChild(node2) 

     let joint = SKPhysicsJointFixed.jointWithBodyA(node1.physicsBody!, bodyB: node2.physicsBody!, anchor: node1.position) 

     self.physicsWorld.addJoint(joint) 

     self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
     node1.physicsBody!.applyImpulse(CGVector(dx: -10, dy: 0)) 
    } 
} 

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

enter image description here
Примечание МФП был отрезан немного на дне.

+0

Я буду экспериментировать с добавлением суставного тела. Спасибо за идею! – Kendel

Смежные вопросы