遵循路径逆

时间:2015-12-12 19:23:17

标签: ios rotation sprite-kit

我正在制作一个精灵来运行一个点,为此我创建了一个跟随该精灵的路径:

    let dx1 = base1!.position.x - self.frame.width/2
    let dy1 = base1!.position.y - self.frame.height/2

    let rad1 = atan2(dy1, dx1)

    path1 = UIBezierPath(arcCenter: circle!.position, radius: (circle?.position.y)! - 191.39840698242188, startAngle: rad1, endAngle: rad1 + CGFloat(M_PI * 4), clockwise: true)
    let follow1 = SKAction.followPath(path1.CGPath, asOffset: false, orientToPath: true, speed: 200)
    base1?.runAction(SKAction.repeatActionForever(follow1))

这是有效的,精灵开始围绕这一点进行轨道运行。问题是,当用户触摸屏幕时,我希望该精灵开始逆时针旋转。为此我写了相同的代码顺时针旋转,但编辑最后一行:

base1?.runAction(SKAction.repeatActionForever(follow1).reversedAction())

但问题是虽然它逆时针旋转,但精灵图像会水平翻转。我该怎么做才能避免这种情况?或者还有其他方法可以通过一个点来运行精灵吗?

1 个答案:

答案 0 :(得分:1)

围绕点(即轨道)旋转精灵的直接方法是创建容器节点,在偏移处(相对于容器的中心)向节点添加精灵,并旋转容器节点。以下是如何执行此操作的示例:

class GameScene: SKScene {
    let sprite = SKSpriteNode(imageNamed:"Spaceship")
    let node = SKNode()

    override func didMove(to view: SKView) {
        sprite.xScale = 0.125
        sprite.yScale = 0.125
        sprite.position = CGPoint (x:100, y:0)

        node.addChild(sprite)
        addChild(node)

        let action = SKAction.rotate(byAngle:CGFloat.pi, duration:5)

        node.run(SKAction.repeatForever(action), withKey:"orbit")
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let action = node.action(forKey: "orbit") {
            // Reverse the rotation direction
            node.removeAction(forKey:"orbit")
            node.run(SKAction.repeatForever(action.reversed()),withKey:"orbit")
            // Flip the sprite vertically
            sprite.yScale = -sprite.yScale
        }
    }
}