如何通过角度移动SpriteNode?

时间:2019-01-08 02:33:02

标签: swift sprite-kit 2d-games skaction

我正在尝试创建一个小型游戏,其中SpriteNode(又名Player)以恒定的速度垂直向上移动。我想用它的角度向左或向右转向。但是,我无法使用其角度正确移动播放器。

谢谢您的时间。

这是我写的部分代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
            let location = touch.previousLocation(in: self)
        if location.x < self.size.width / 2 && location.y < self.size.height / 2 {
            // Turn Left
            print("TURNING LEFT")
            turn(left: true)
         } else if location.x >= self.size.width / 2 && location.y < self.size.height / 2 {
            // Turn Right
            print("TURNING RIGHT")
            turn(left: false)
         } else if location.y > self.size.height / 2 {
            // Go Up
            print("GOING UP!")
            move()
         }
    }
}

func turn(left: Bool) {
    if left {
        // Turn Left
        let turnAction = SKAction.rotate(byAngle: 0.1, duration: 0.05)
        let repeatAction = SKAction.repeatForever(turnAction)
        player?.run(repeatAction)
    } else {
        // Turn Right
        let turnAction = SKAction.rotate(byAngle: -0.1, duration: 0.05)
        let repeatAction = SKAction.repeatForever(turnAction)
        player?.run(repeatAction)
    }
}

func move() {
    // Move Up
    let moveAction = SKAction.moveBy(x: 0, y: 15, duration: 0.5)
    let repeatAction = SKAction.repeatForever(moveAction)
    player?.run(repeatAction)
}

2 个答案:

答案 0 :(得分:1)

使用三角函数,可以确定子画面在任一方向上的x和y速度,从而为子画面指向一个角度。 here可以找到一篇很棒的文章,总结了如何做到这一点。

如果您只是想真正旋转精灵,可以通过创建旋转的SKAction并在节点上运行操作来完成。

// Create an action, duration can be changed from 0 so the user can see a smooth transition otherwise change will be instant.
SKAction *rotation = [SKAction rotateByAngle: M_PI/4.0 duration:0]; 
//Simply run the action.
[myNode runAction: rotation];

答案 1 :(得分:0)

由于@ makertech81链接,我能够编写以下有效的代码:

func move() {
    // Move Up
    let playerXPos = sin((player?.zRotation)!) * -playerSpeed
    let moveAction = SKAction.moveBy(x: playerXPos, y: playerSpeed, duration: 0.5)
    let repeatAction = SKAction.repeatForever(moveAction)
    player?.run(repeatAction)
}

基本上,因为我知道通过zRotation的角度,并且我也知道Player会向Y方向移动多少,所以我能够计算出其sin(X值)。因此,可以正确地将moveAction计算到其目的地。

希望有帮助。