模拟两个Sprite Kit节点的万有引力

时间:2015-07-19 10:11:12

标签: ios swift sprite-kit

我在Sprite Kit中有两个节点,我在Swift中写作。

如何通过重力使节点彼此吸引?另外,我如何使用他们的群众?如果一个物体的质量很大,它应该更有吸引力。

1 个答案:

答案 0 :(得分:22)

您可以使用适当的万有引力方程比率遍历所有节点并计算所有其他节点的脉冲。我刚刚写了一个简短的例子来说明这是如何完成的。你可以自己定制" mass"因素,但我只是简单地使用Sprite Kit' s。我还增加了一个强度因子来放大冲动。我还假设固定时间步长为1/60秒。

class GameScene: SKScene {
    var nodes: [SKShapeNode] = []
    let dt: CGFloat = 1.0/60.0 //Delta time.
    let radiusLowerBound: CGFloat = 1.0 //Minimum radius between nodes check.
    let strength: CGFloat = 10000 //Make gravity less weak and more fun!
    override func didMoveToView(view: SKView) {
        self.physicsWorld.gravity = CGVector()
        for i in 1 ... 50 { //Create 50 random nodes.
            let rndRadius = 15 + CGFloat(arc4random_uniform(20))
            let rndPosition = CGPoint(x: CGFloat(arc4random_uniform(UInt32(self.size.width))), y: CGFloat(arc4random_uniform(UInt32(self.size.height))))
            let node = SKShapeNode(circleOfRadius: rndRadius)
            node.position = rndPosition
            node.physicsBody = SKPhysicsBody(circleOfRadius: rndRadius)
            self.addChild(node)
            nodes.append(node)
        }
    }
    override func update(currentTime: NSTimeInterval) {
        for node1 in nodes {
            for node2 in nodes {
                let m1 = node1.physicsBody!.mass*strength
                let m2 = node2.physicsBody!.mass*strength
                let disp = CGVector(dx: node2.position.x-node1.position.x, dy: node2.position.y-node1.position.y)
                let radius = sqrt(disp.dx*disp.dx+disp.dy*disp.dy)
                if radius < radiusLowerBound { //Radius lower-bound.
                    continue
                }
                let force = (m1*m2)/(radius*radius);
                let normal = CGVector(dx: disp.dx/radius, dy: disp.dy/radius)
                let impulse = CGVector(dx: normal.dx*force*dt, dy: normal.dy*force*dt)

                node1.physicsBody!.velocity = CGVector(dx: node1.physicsBody!.velocity.dx + impulse.dx, dy: node1.physicsBody!.velocity.dy + impulse.dy)
            }
        }
    }
}

enter image description here

除了手动执行计算外,您还可以将field nodes添加到物理实体以模拟效果。虽然被警告,但某些版本的Sprite Kit中的字段节点为broken