在SpriteKit中绕轨道运行SKFieldNode的难度

时间:2016-02-14 02:41:42

标签: swift sprite-kit skfieldnode

我试图让一个简单的SKSpriteNode在SKFieldNode.radialGravityField()进入其定义的SKRegion后完美地进行轨道运行。我通过self.physicsWorld.gravity = CGVectorMake(0.0, 0.0)将场景的重力设置为零。

我正在尝试模拟真实空间。我听说过使用关节,但这并不像使用真实重力计算一样平滑。这里有什么想法吗?

编辑:到目前为止,我的代码无法正常运行。它会将一个物体发送到radialGravityField(),但不能完美地绕行(甚至接近完美)。它确实在轨道运行,但是在一个狂野的椭圆中。当我说完美时,我的意思是围绕引力场中心的圆圈形状。

ADDITION:我只想到了使用radialGravityField()的替代方案。也许在update方法中计算飞行物体的位置会更容易。如果它的位置在行星的半径范围内,那么使用SKJoint并让它进入轨道。有人这样做过吗?

提前谢谢!

到目前为止,这是我的代码......

   import SpriteKit

    class GameScene: SKScene {

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */

        self.physicsWorld.gravity =  CGVectorMake(0.0, 0.0)
        self.view?.backgroundColor = UIColor.darkGrayColor()


        let circle = SKShapeNode(circleOfRadius: 30.0)
        circle.position = CGPoint(x: self.frame.width / 2 + 10, y: self.frame.height / 2)
        circle.fillColor = .whiteColor()
        addChild(circle)


        let gravityField = SKFieldNode.radialGravityField()
        gravityField.position = circle.position
        gravityField.region = SKRegion(radius: 100.0)
        gravityField.strength = 4.0
        gravityField.enabled = true
        addChild(gravityField)


    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
       /* Called when a touch begins */
        let p = SKSpriteNode(color: UIColor.purpleColor(), size: CGSize(width: 20, height: 20))
        p.physicsBody = SKPhysicsBody(rectangleOfSize: p.size)
        p.physicsBody?.dynamic = true
        p.physicsBody?.mass = 0.5
        p.position = touches.first!.locationInNode(self)

        addChild(p)

        p.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 300 * p.physicsBody!.mass))

    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
    }

1 个答案:

答案 0 :(得分:1)

您的物体处于椭圆形状,因为它的速度与该距离处的重力不完全匹配。如果它最初从重力场射出,那么它对于圆形轨道来说太快了,试着降低它的速度。如果它最初落向重力场,则它会变得太慢,所以尝试增加速度。

或者,您可以调整距离场的初始距离或重力场的强度。

应该可以使轨道成圆形,但是需要大量的摆弄,并且如果有任何扰乱轨道(例如碰撞),那么它将再次抛出。

这更多是关于轨道动力学的物理而不是编程。重力是否是正确的解决方案取决于您在最终应用程序中想要实现的目标。也许this SO question有一些有用的信息。