2016-11-15 15 views
1

を働いていない、私は永遠に回転アクションを実行する必要がありますボックスとのシーンがありますSceneKit SCNAction.runと回転が

dpsは、ユーザーが変更することができ財産です。

override func viewDidAppear() { 
     super.viewDidAppear() 

     let scene = SCNScene() 
     scene.rootNode.addChildNode(boxNode) 
     self.rateScene.scene = scene 

     let actionwait = SCNAction.wait(duration: 0.001) 
     let run = SCNAction.run {_ in 
      let fps = 60.0 
      let delta = (self.dps*3.14/180.0)/fps 
      self.boxNode.rotation.z -= CGFloat(delta) 
     } 
     let moveSequence = SCNAction.sequence([actionwait, run]) 
     let forever = SCNAction.repeatForever(moveSequence) 
     boxNode.runAction(forever) 

    } 

変数self.boxNode.rotation.z - 毎回変更されますが、ボックスは回転しません。

+0

SpriteKitの代わりにこのSceneKitはありませんか? – jjs

+0

@jjs、はい、しかし、問題の領域、カスタムアクションのアクティビティを定義するために使用されるクロージャは、おそらくSpriteKitと全く同じ問題です。 – Confused

+0

@artiこのようなカスタムアクションを作成するインスピレーションをどこから得ましたか?私は個人的な理由から本当に興味があります。私はあなたがこれについて考えている方法が好きで、似たようなことをしたい。 – Confused

答えて

3

SCNAction.runが一度評価されるだけなので、これはうまくいきません。値を変更するたびにアクションを再割り当てする必要があります。

あなたができることは、そのようなものです。単にあなたのスライダーのIBActionでそのコードを入れて(または任意のユーザーが値を制御するために使用しています)

let fps = 60.0 
let delta = (self.dps * 3.14/180.0)/fps 

SCNTransaction.begin() 
SCNTransaction.animationDuration = 0.1 
boxNode.rotation.z -= Float(delta) 
SCNTransaction.commit() 
1

どのシーンやシーンの所有者にDPS特性を維持し、DPSのdidSetを使用してはどうですか? DPSの変化が1秒以内にキャッチすることができ、あなたの行動は、新しい回転速度で再開ます

let radiansPerSecond = M_PI/180.0 * dps 
let rotate = SCNAction.repeatForever(SCNAction.rotateBy(x: 0.0, y: 0, z: radiansPerSecond, duration: 1.0)) 
boxNode.runAction(rotate) 

didSetは回転、のようなものをリセットします。また、毎秒60回新しいSCNActionを設定する必要はありません。

関連する問題