2017-07-10 20 views
0

私は時計のようなものを手で掃除しようとしています。SKAction期間内に映画が完成しませんか?

私はNSDateから分を引きます。

その後やや私は私のスプライトが中に移動しなければならない次のXY位置を計算し、次の分の始めに続いてラジアン値を計算し、私のスプライトが1分にまで移動しなければならないXY位置を見つけ、

その分。

私はすべてを正しく理解していますと仮定すると、更新機能

//Get Current Minute 
var currentTime = NSDate(); 
var nowCal = NSCalendar(calendarIdentifier: NSCalendar.Identifier.ISO8601) 
var currMin = nowCal?.component(.minute, from: currentTime as Date) 

//Print current minute   
print(currMin) 

// slicing the circle into 60 segments and getting which angle in radians the sprite should move to in the next min 
var minAng = (2*CGFloat.pi)/60 * CGFloat(currMin!) 

//calculating point on the circle where the sprite should move to in the next min   
var newPt = CGPoint(x: (300 * cos(minAng)), y: -(300 * sin(minAng))) 

//print out where the sprite currently is and where it should move to 
print(hand.position) 
print(newPt) 


//move the sprite to the new location over 60 seconds, making sure the movement is linear   
let moveHand = SKAction.move(to: newPt, duration: 60) 
moveHand.timingMode = SKActionTimingMode.linear 
hand.run(moveHand) 

//move another placeholder sprite to the final destination instantly to visualise movment by waiting for the moving sprite. 
handToBe.run(SKAction.move(to: newPt, duration: 0)) 

内のこれらのコードを持っているので、それが次に移動する必要が前のセグメントの終わりに到達し、1分でセグメントを移動する必要がありますセグメント。

ただし、私のスプライトは次のセグメントに移動する前にセグメントの最後に到達することはありません。プリントアウトは常に遅すぎることを示しています。

何か私はSKAction.move(to:)について理解していないか、このインスタンスに欠陥がありますか?

+0

rotateToアクションを使用するのはなぜですか? – Knight0fDragon

+0

私は回転していません。円軌道上を移動しなければならないスプライトです。 私はそれを1つの端に点を持つ本当に大きな透明なスプライトにすることができますが、2つの問題が存在すると思います。 スプライトを回転させて円で移動することはできません。スケールすることは難しいでしょう。 また、私はMovetoの長時間の問題を学習実験として理解しようとしており、代替方法を見つけようとはしていません。 しかし、私は、durationによって回転すると思われますが、同様に動作します。 – Eivie

+0

はいそれは同じ振る舞いになります – Knight0fDragon

答えて

1

update関数からコードを削除して、自分で呼び出す関数でコードを実行してみてください。 updateはすべてのフレームで呼び出されるので、スプライトは移動を開始し、次のフレームは別の位置に移動するように指示されるため、同時に2つの移動アクションが実行されます。それに続く3つの移動アクションがあるフレームは、それが同時にそれに影響を与える他の移動アクションのために最初の意図された位置に決して到達することはないということを意味する可能性があります。

+0

あなたは何を意味するのか分かります。しかし、それは60秒間に1秒間に60分の1秒間持続するフレームでは、私が60分の1秒で動作するように呼び出された動作が終了していないことを意味するでしょうか? 私は、更新機能からコードを削除し、永遠に繰り返しを使用することができますが、それはパスの実装を意味するでしょう。私は、それがコードを複雑にするように聞こえるので、それについては躊躇しています、そして、私が目指している時計の精度を提供するかどうかもわかりません。 – Eivie

+0

はい、アクションの継続時間が60秒に設定されているため、アクションはフレームで終了しませんでした。パスを実装する必要があるかどうかはわかりません。 run(someAction、completion:{callTheActionAgain()}) – JohnV

+0

のような最初の移動アクションが完了したら、次の移動アクションを実行できます。私はそのオプションも探検します。 実際に私は1秒間に60分の1に実行するように設定したと言いましたが、私は間違っていました 私のコードを再読して、実際には60秒間に60秒でポイントに移動するよう求めました。 これが問題の原因になりますか? – Eivie

関連する問題