2017-01-28 2 views
2

Как определить SKAction, а затем обновить число градусов, которое мой узел будет вращать? Я пытаюсь определить его с помощью переменных, но когда я обновляю значения переменных, действие не обновляется.Вращение SKSpritenode сменяющимся числом градусов

var degreesToRotate = 4 
var direction = 1 

let action = SKAction.rotate(byAngle: CGFloat(degreesToRotate * direction), duration: TimeInterval(2)) 
      charector.run(SKAction.repeatForever(action)) 

direction = -1 
+0

Вы должны использовать 'SKAction.rotate (byAngle' с радианами, а не градусами, посмотрите [здесь] (https://developer.apple.com/reference/spritekit/skaction/1417805-rotate) –

+0

Это дает мне ошибка «ожидаемого разделителя»: пусть действие = SKAction.rotate (byAngle radians: CGFloat (directionToRotate * direction), duration: TimeInterval (2)) – John

+0

@John Так вы называете этот метод: 'let action = SKAction.rotate (byAngle: CGFloat (M_PI), продолжительность: 1) ', не просто копировать и вставлять код из документов. – Whirlwind

ответ

2
import SpriteKit 
import GameplayKit 

//Extensions borrowed from here : http://stackoverflow.com/a/29179878/3402095 

extension Int { 
    var degreesToRadians: Double { return Double(self) * .pi/180 } 
    var radiansToDegrees: Double { return Double(self) * 180/.pi } 
} 
extension FloatingPoint { 
    var degreesToRadians: Self { return self * .pi/180 } 
    var radiansToDegrees: Self { return self * 180/.pi } 
} 

let kActionKey = "rotate" 

class GameScene:SKScene { 

    let purpleCube = SKSpriteNode(color: .purple, size: CGSize(width: 150, height: 150)) 
    let yellowCube = SKSpriteNode(color: .yellow, size: CGSize(width: 150, height: 150)) 

    override func didMove(to view: SKView) { 


     addChild(purpleCube) 
     purpleCube.position.y = purpleCube.size.height 
     purpleCube.name = "purple" 


     addChild(yellowCube) 
     yellowCube.position.y = -yellowCube.size.height 
     yellowCube.name = "yellow" 

     let rotate = SKAction.rotate(byAngle: CGFloat(-M_PI * 2.0), duration: 5) 
     let loop = SKAction.repeatForever(rotate) 
     purpleCube.run(loop, withKey: kActionKey) 
    } 

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

     super.touchesBegan(touches, with: event) 


     if let touch = touches.first { 

      let location = touch.location(in: self) 

      if let cube = atPoint(location) as? SKSpriteNode { 

       if let name = cube.name { 

        switch name { 

        case "purple": 

         if let action = purpleCube.action(forKey: kActionKey){ 

          purpleCube.run(action.reversed(), withKey: kActionKey) 
         } 


        case "yellow": 

         if action(forKey: "rotating") == nil{ 
          yellowCube.run(SKAction.rotate(byAngle: CGFloat(4.degreesToRadians), duration: 0.1), withKey: kActionKey) 
         } 



        default: 
         break 
        } 
       } 

      } 
     } 

    } 
} 

В этом примере есть два узла, которые были повернуты в течение двух различных способов. Фиолетовый узел постоянно вращается с определенной скоростью по часовой стрелке. Чтобы достичь этого, я создал действие, которое вращает спрайт на 360 градусов ... Это будет один оборот, который будет повторяться вечно, поэтому спрайт будет повернут навсегда.

О желтом узле ... Он будет повернут на 4 градуса каждый раз, когда вы нажмете на него. В настоящее время вам нужно подождать, пока стрелка перестанет вращаться, чтобы вы могли повернуть ее больше. Конечно, это необязательно, я просто хотел показать вам полезность клавиш действия.

Направление вращения

Поскольку в SpriteKit 0 градусов указуют положительную ось х и положительный угол в направлении против часовой стрелки, я повернут фиолетовый куб на -360 градусов, который вращает спрайты в направлении по часовой стрелке. Чтобы узнать больше о системе координат SpriteKit, прочитайте this documentation section.

Радианы Vs Градусы

Как вы можете видеть, я имею в виду в градусах, а не в радианах ... Это потому, что это было бы очень трудно сказать, я повернул спрайт на 6.2831853072 радианах:) Вот почему я использовал расширения, которые делают преобразование из градусов в радианы и наоборот. Вы можете использовать это часто, поэтому я добавил их для вас.

+0

Именно то, что я искал! Спасибо огромное! – John

Смежные вопросы