2017-01-28 8 views
2

どのようにSKActionを定義し、ノードを回転させる度数を更新できますか?変数で定義しようとしていますが、変数値を更新するとアクションは更新されません。この例では変化する度数でSKSpritenodeを回転

+0

あなたは 'SKAction.rotate(byAngle'はラジアンで、度ではありません)を使うべきです[ここ](https://developer.apple.com/reference/spritekit/skaction/1417805-rotate) –

+0

それは私に与えます"期待セパレータ"エラー:let action = SKAction.rotate(byAngleラジアン:CGFloat(degreesToRotate * direction)、duration:TimeInterval(2)) – John

+0

@Johnこれはあなたがそのメソッドを呼び出す方法です: 'let action = SKAction.rotate – Whirlwind

答えて

2
var degreesToRotate = 4 
var direction = 1 

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

direction = -1 
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 
        } 
       } 

      } 
     } 

    } 
} 

、2つの異なる方法で回転された2つのノードがあります。パープルノードは時計回りにある速度で常に回転します。これを達成するために、スプライトを360度回転させるアクションを作成しました。これは1回転になり、永遠に繰り返されるので、スプライトは永遠に回転します。

黄色のノードについて...それをタップするたびに4度回転します。現在、スプライトの回転が停止するのを待たなければならないので、回転させることができます。これはオプションですが、私はあなたにアクションキーの有用性を示したかっただけです。

回転方向

SpriteKitベース0度で正のx軸と正の角度を指定しているため反時計方向にあり、Iは時計方向にスプライトを回転-360度紫キューブを、回転させました。 SpriteKit座標系の詳細については、this documentation sectionを参照してください。

ラジアンVsはあなたが見ることができるように、私はむしろラジアンよりも、度で話してい

学位...それはそれは言うのは本当に難しいだろうので、私は6.2831853072ラジアンでスプライトを回転させています。 )そのため、私は、度からラジアンへの変換とその逆の変換を行う拡張を使用しています。あなたはこれを頻繁に使用するかもしれないので、私はあなたのためにそれらを追加しました

+0

まさに私が探していたもの!どうもありがとうございます! – John

関連する問題