Как переместить SpriteNode по его углу? - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь создать маленькую игру, в которой 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 голосов
/ 08 января 2019

Благодаря ссылке @ 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, а также знаю, на сколько игрок будет двигаться в направлении Y, я смог вычислить его sin (что является значением X). Следовательно, moveAction будет правильно рассчитано по направлению к месту назначения.

Надеюсь, это поможет.

0 голосов
/ 08 января 2019

Используя тригонометрию, вы можете определить скорость спрайта x и y в любом направлении, создавая угол, на который спрайт должен указывать. Отличную статью, в которой описывается, как это сделать, можно найти здесь .

Если вы просто хотите буквально повернуть спрайт, это можно сделать, создав 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];
...