2017-06-25 2 views
9

ここに誰もがAgar.ioを演奏したことがあるなら、おそらくカメラが動く方法に慣れているでしょう。マウスが画面の中心からの距離に応じて、マウスの方にスライドします。私はSKCameraNodeとtouchesMovedを使用して、この運動を再作成しようとしている:スイフト:Agar.ioのような滑らかなSKCameraNodeの動き?

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let pos = touches.first!.location(in: view) 
    let center = view!.center 
    let xDist = pos.x - center.x 
    let yDist = pos.y - center.y 
    let distance = sqrt((xDist * xDist) + (yDist * yDist)) * 0.02 
    camera?.position.x += xDist * distance * 0.02 
    camera?.position.y -= yDist * distance * 0.02 
} 

驚くべきことに、これはそれほど悪くは見えません。しかし、これには2つの問題があります。

最初は、私はそれが複数のタッチではるかに良い仕事したいので、このためにUIPanGestureRecognizerを使用したいということです。タッチから画面の中央までの距離を得るための方法を考えることができないので、これがどのように行われるのか想像もできません。

第二の問題は、この動きが滑らかでないことです。ユーザが単一のフレームのために指を動かすことを止めれば、カメラが絶対停止するまでスナップするので大きなジャンプがあります。私は数学ではひどいので、すばらしい滑らかな減衰(または攻撃)を実装する方法について考えることはできません。

すべてのヘルプは素晴らしいだろう!

EDIT:私は今これをやっている:

private var difference = CGVector() 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let pos = touches.first!.location(in: view) 
    let center = view!.center 
    difference = CGVector(dx: pos.x - center.x, dy: pos.y - center.y) 
} 

override func update(_ currentTime: TimeInterval) { 
    let distance = sqrt((difference.dx * difference.dx) + (difference.dy * difference.dy)) * 0.02 
    camera?.position.x += difference.dx * distance * 0.02 
    camera?.position.y -= difference.dy * distance * 0.02 
} 

私が今知っておく必要があるのは、スムーズに、ユーザが画面に触れた時から増加する差変数を得るための良い方法です。

EDIT 2:は今、私はこれをやっている:それはどんな悪いことを取得する前に

private var difference = CGVector() 
private var touching: Bool = false 
private var fade: CGFloat = 0 

private func touched(_ touch: UITouch) { 
    let pos = touch.location(in: view) 
    let center = view!.center 
    difference = CGVector(dx: pos.x - center.x, dy: pos.y - center.y) 
} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    touching = true 
    touched(touches.first!) 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    touched(touches.first!) 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    touching = false 
    touched(touches.first!) 
} 

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 
    touching = false 
} 

override func update(_ currentTime: TimeInterval) { 
    if touching { 
    if fade < 0.02 { fade += 0.0005 } 
    } else { 
    if fade > 0 { fade -= 0.0005 } 
    } 
    let distance = sqrt((difference.dx * difference.dx) + (difference.dy * difference.dy)) * 0.01 
    camera?.position.x += difference.dx * distance * fade 
    camera?.position.y -= difference.dy * distance * fade 
} 

誰かが私を助けてくださいことはできますか?フェード変数はひどいやり方で増分され、滑らかではありません。私はこれを行うためのより良い方法を私にちょっとしたヒントを与えるために誰かが必要です。

+0

しかし、私は遅れ運動の同じ種類でゲームをやって友人を持っていたし、それが原因でインタフェースガイドラインのアップルによって拒否されました、私はあなたが望むものを理解し、私はそれを作るするかどうかはわかりません。したがって、この効果を誇張しないように注意してください。ユーザーは自分のiPhoneが遅いと思うかもしれません。私はそれを受け入れることができるように –

+0

線形補間に見て(https://en.wikipedia.org/wiki/Linear_interpolation)@CMilbyあなたは答えとしてこれを追加することができ – CMilby

+0

?私は今、最も明白なものを見上げないために馬鹿だと感じる – MysteryPancake

答えて

2

Linear Interpolationを試してみてください。線形補間を使用すると、オブジェクトがゆっくりとスムーズに時間をかけてスピードアップまたはスローダウンします。

関連する問題