Sprite kit SpriteKit:将船顺时针旋转一圈

Sprite kit SpriteKit:将船顺时针旋转一圈,sprite-kit,skaction,Sprite Kit,Skaction,在SpriteKit中,我想定位一个宇宙飞船sprite,以便: (a) 顺时针或逆时针旋转 (b) 精灵旋转,它的鼻子总是指向中心,不管它在圆上的什么位置 目前我有以下输出: 我的理想输出如图所示 我的代码如下: 类游戏场景:SKScene{ lazy var circleNode:SKShapeNode = { var circle = SKShapeNode(circleOfRadius: 200) circle.position = CGPoint(x: frame

在SpriteKit中,我想定位一个宇宙飞船sprite,以便:

(a) 顺时针或逆时针旋转

(b) 精灵旋转,它的鼻子总是指向中心,不管它在圆上的什么位置

目前我有以下输出:

我的理想输出如图所示

我的代码如下:

类游戏场景:SKScene{

lazy var circleNode:SKShapeNode = {
    var circle = SKShapeNode(circleOfRadius: 200)
    circle.position = CGPoint(x: frame.midX, y: frame.midY)
    circle.strokeColor = SKColor.purple
    circle.lineWidth = 10.0
    circle.glowWidth = 2.0
    circle.physicsBody?.isDynamic = false
    return circle
}()

lazy var shipNode: SKSpriteNode = {
    var sprite = SKSpriteNode(imageNamed: "ship")
    sprite.position = CGPoint(x: circleNode.frame.minX, y: circleNode.frame.minY)
    sprite.xScale = 2
    sprite.yScale = 2
    sprite.zPosition = 1
    return sprite
}()

class func newGameScene() -> GameScene {
    // Load 'GameScene.sks' as an SKScene.
    guard let scene = SKScene(fileNamed: "GameScene") as? GameScene else {
        print("Failed to load GameScene.sks")
        abort()
    }

    // Set the scale mode to scale to fit the window
    scene.scaleMode = .aspectFill

    return scene
}    

func setUpScene() {
    self.addChild(circleNode)
    self.addChild(shipNode)
}

override func didMove(to view: SKView) {
    self.setUpScene()
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

    let touch = touches.first
    if let location = touch?.location(in: self){
        if location.x > shipNode.position.x {
            let moveToRight = SKAction.moveBy(x: 1, y: 0, duration: 5)
            let forever = SKAction.repeatForever(moveToRight)
            shipNode.run(forever, withKey: "move")
        }else{
            let moveToLeft = SKAction.moveBy(x: -1, y: 0, duration: 5)
            let forever = SKAction.repeatForever(moveToLeft)
            shipNode.run(forever, withKey: "move")
        }
    }

}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    shipNode.removeAction(forKey: "move")
}
但这里的问题是,它是围绕着路径自身设置动画的,这不是我想要的。相反,只有用户触摸才能使飞船顺时针或逆时针移动

我如何确保:

(a) 精灵坐在圆形的小路上 (b) 精灵的鼻子总是指向圆心


非常感谢

您可以通过将船舶添加到集装箱(一个
SKNode
),将船舶定位在圆上的一个点上(零度),将船舶指向圆的中心,然后旋转集装箱来实现这一点。下面是一个示例

let sprite = SKSpriteNode(imageNamed:"your_ship_name")
let container = SKNode()

override func didMove(to view:SKView) {
    let numRotations:CGFloat = 100
    let circleRadius:CGFloat = 200

    addChild(container)
    // Rotate so the ship initially points to the center
    sprite.zRotation = CGFloat.pi/2
    sprite.position = CGPoint(x: circleRadius, y: 0)
    container.addChild(sprite)

    let rotate = SKAction.rotate(byAngle: 2 * CGFloat.pi * numRotations, duration: 5 * TimeInterval(numRotations))

    container.run(rotate.reversed())
}

听起来不错,我稍后会试试。非常感谢这个答案,简单、优雅,绝对不需要过多的计算。您好0x141E您的解决方案效果很好。飞船现在坐在圆圈上,绕着圆圈移动,并指向屏幕的中心!非常感谢!
let sprite = SKSpriteNode(imageNamed:"your_ship_name")
let container = SKNode()

override func didMove(to view:SKView) {
    let numRotations:CGFloat = 100
    let circleRadius:CGFloat = 200

    addChild(container)
    // Rotate so the ship initially points to the center
    sprite.zRotation = CGFloat.pi/2
    sprite.position = CGPoint(x: circleRadius, y: 0)
    container.addChild(sprite)

    let rotate = SKAction.rotate(byAngle: 2 * CGFloat.pi * numRotations, duration: 5 * TimeInterval(numRotations))

    container.run(rotate.reversed())
}