2017-06-25 46 views
9

Burada daha önce hiç kimse Agar.io oynamışsa, muhtemelen kameranın hareket tarzına aşina olacaksınız. Farenizin ekranın ortasındaki mesafesine bağlı olarak farenize doğru kaydırır.Swift: Agar.io benzeri pürüzsüz SKCameraNode hareketi?

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 
} 

Şaşırtıcı, bu çok kötü görünmüyor: Bir SKCameraNode ve touchesMoved kullanarak bu hareketi yeniden yaratmaya çalışıyorum. Bununla birlikte, bununla ilgili iki sorun var.

Birincisi, birden çok dokunuşla çok daha iyi çalıştığı için bunun için bir UIPanGestureRecognizer kullanmak istiyorum. Bunun nasıl yapılacağını hayal edemiyorum, çünkü dokunmatik ekrandan ekranın merkezine olan mesafeyi elde etmek için kullanmanın bir yolunu düşünemiyorum. İkinci problem, bu hareketin düzgün olmamasıdır. Kullanıcı parmağını tek bir çerçeve için hareket ettirmeyi durdurursa, kamera tam olarak durduğundan dolayı büyük bir atlama olur. Ben matematikte berbatım, bu yüzden güzel bir düzensizlik (veya saldırı) uygulamak için bir yol düşünemiyorum.

Herhangi bir yardım harika olurdu!

DÜZENLEME: Şimdi yapıyorum:

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 
} 

Şimdi bilmem gereken tek şey sorunsuz kullanıcı ekrana dokunduğunda zaman artmaya farkı değişkeni almak için iyi bir yoldur.

DÜZENLEME 2: herhangi bir kötüleşmeden

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 
} 

Biri yardım edebilir: Şimdi yapıyorum? Fade değişkeni korkunç bir şekilde artırılıyor ve pürüzsüz değil ve bunu yapmanın daha iyi bir yolunu bana hafif bir ipucu vermek için birine ihtiyacım var.

+0

Ne istediğinizi anlıyorum ve nasıl yapılacağından emin değilim, ancak aynı türden bir gecikmeli hareketle bir arkadaşım vardı ve arayüz yönergeleri nedeniyle Apple tarafından reddedildi. Bu etkiyi abartmamak için dikkatli olun; kullanıcılar iPhone'larının sadece yavaş olduğunu düşünebilirdi. –

+0

Doğrusal enterpolasyona bakın (https://en.wikipedia.org/wiki/Linear_interpolation) – CMilby

+0

@CMilby bunu yanıt olarak ekleyebilir miyim? Şimdi en bariz şeyi aramak için aptalım. – MysteryPancake

cevap

2

Linear Interpolation'u deneyin. Doğrusal enterpolasyon bunu yapabilmenizi sağlar, böylece nesneniz yavaş ve yavaş bir şekilde hızlandırabilir veya zaman içinde yavaşlayabilir.