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

我在Sprite Kit中有两个节点,我正在用Swift编写。

我将如何通过重力使节点相互吸引? 另外,我将如何使用他们的群众? 如果一个物体的质量很大,就应该更加吸引人。

您可以遍历所有节点,并使用万有引力方程的适当比率计算所有其他节点的冲量。 我刚刚写了一个快速的例子,展示了这是如何完成的。 你可以自己定制“质量”因素,但是我只是使用Sprite Kit的。 我还增加了一个强度因素来放大冲动。 我也假设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) } } } } 

在这里输入图像说明

您也可以将场节点添加到您的物理实体来模拟效果,而不是手动执行计算。 虽然被警告,但是Sprite Kit的某些版本中的字段节点被打破了。