2017-06-25 25 views
9

Nếu có ai ở đây đã chơi Agar.io trước đây, có thể bạn sẽ quen thuộc với cách camera di chuyển. Nó trượt về phía con chuột của bạn tùy thuộc vào khoảng cách con chuột của bạn là từ trung tâm của màn hình. Tôi đang cố gắng tạo lại chuyển động này bằng cách sử dụng SKCameraNode và chạm vàoMoved:Swift: Chuyển động mượt mà của SKCameraNode giống như Agar.io?

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 
} 

Đáng ngạc nhiên, điều này không quá tệ. Tuy nhiên, có hai vấn đề với điều này.

Đầu tiên là tôi muốn sử dụng UIPanGestureRecognizer cho việc này, vì nó sẽ hoạt động tốt hơn nhiều với nhiều lần chạm. Tôi chỉ không thể tưởng tượng được điều này có thể được thực hiện như thế nào, vì tôi không thể nghĩ ra một cách để sử dụng nó để có được khoảng cách từ việc chạm đến trung tâm của màn hình.

Vấn đề thứ hai là chuyển động này không trơn tru. Nếu người dùng ngừng di chuyển ngón tay của họ cho một khung hình duy nhất, có một bước nhảy rất lớn kể từ khi máy ảnh dừng lại để tạm dừng tuyệt đối. Tôi kinh khủng về toán học, vì vậy tôi không thể nghĩ ra một cách để thực hiện một phân rã mịn tốt đẹp (hoặc tấn công).

Mọi trợ giúp đều tuyệt vời!

EDIT: Tôi bây giờ làm điều này:

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 
} 

Tất cả tôi cần phải biết bây giờ là một cách tốt để có được những biến sự khác biệt để tăng suốt từ thời điểm người sử dụng chạm vào màn hình.

EDIT 2: Bây giờ tôi đang làm điều này:

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 
} 

Ai đó có thể vui lòng giúp tôi trước khi nó được bất kỳ tồi tệ hơn? Biến fade được tăng lên một cách khủng khiếp và nó không trơn tru, và tôi chỉ cần một ai đó để cho tôi một gợi ý nhỏ về cách tốt hơn để làm điều này.

+0

Tôi hiểu những gì bạn muốn và tôi không chắc chắn làm thế nào để làm cho nó, tuy nhiên tôi đã có một người bạn làm một trò chơi với cùng một loại phong trào bị trì hoãn và nó đã bị từ chối bởi Apple vì các hướng dẫn giao diện. Vì vậy, hãy cẩn thận không để phóng đại hiệu ứng này; người dùng có thể nghĩ rằng iPhone của họ chỉ chậm. –

+0

Nhìn vào nội suy tuyến tính (https://en.wikipedia.org/wiki/Linear_interpolation) – CMilby

+0

@CMilby bạn có thể thêm điều này làm câu trả lời để tôi có thể chấp nhận nó không? Bây giờ tôi cảm thấy ngớ ngẩn vì không nhìn lên thứ rõ ràng nhất – MysteryPancake

Trả lời

2

Hãy thử Linear Interpolation. Nội suy tuyến tính có thể làm cho nó để đối tượng của bạn sẽ từ từ và trơn tru tăng tốc độ hoặc làm chậm theo thời gian.

Các vấn đề liên quan