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.
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. –
Doğrusal enterpolasyona bakın (https://en.wikipedia.org/wiki/Linear_interpolation) – CMilby
@CMilby bunu yanıt olarak ekleyebilir miyim? Şimdi en bariz şeyi aramak için aptalım. – MysteryPancake