2012-11-05 27 views
19

Tôi đang tạo một trò chơi với LibGDX (Java).Làm thế nào để làm cho một máy ảnh mịn theo thuật toán?

Tôi cần máy ảnh theo một ký tự chuyển động nhanh. Cách dễ nhất để thực hiện việc này là chỉ cần viết điều này:

this.getCamera().position.set(obj.x, obj.y, 0); 

Nhưng, có bất kỳ thuật toán nào để làm cho điều này trơn tru hơn không? Giống như khi máy ảnh không nghiêm ngặt và luôn muộn một chút: nhân vật chạy nhanh ngay, máy ảnh theo sau với một chút chậm trễ hoặc nếu bạn đột nhiên xuất hiện ở đâu đó, máy ảnh sẽ không dịch chuyển tức thì nhưng sẽ di chuyển với tốc độ tối đa khi bạn đến gần hơn nó chậm lại một chút và tìm thấy bạn một lần nữa.

Có bất kỳ libgdx lib nào thực hiện điều đó hoặc bất kỳ ai có trải nghiệm này không?

+0

"* Nhưng, có bất kỳ thuật toán nào để làm việc này trơn tru hơn không? *" Bạn đã tự mình thử bất kỳ thuật toán nào hay thực hiện bất kỳ tìm kiếm Google nào cho nội suy máy ảnh mượt mà hay gì đó? –

+1

Tôi đã thử nó một mình và có một số ví dụ, nhưng tôi không thích kết quả nhiều, tôi tò mò có thể có một thứ gì đó đã được tìm ra vì nó có vẻ giống như bất kỳ game dev nào, Về google search, tôi không chắc những gì để tìm kiếm, nó mang lại rất nhiều thứ khác. –

Trả lời

6

Hãy xem qua số điện thoại Java Universal Tween Engine của Aurelion Ribon. Điều này thực hiện nội suy và có một số phương trình nới lỏng mà tôi nghĩ rằng sẽ giúp bạn có được những gì bạn đang tìm kiếm. Nó cũng có các tính năng tiên tiến khác như waypointing và chuỗi các hành động nhất định với nhau cho các hiệu ứng thú vị khác.

Logic trò chơi của bạn có thể kiểm tra xem nhân vật có đang di chuyển nhanh hay có thay đổi về mặt vị trí hay không. Để đáp lại điều này, hãy biến vị trí máy ảnh hiện tại của bạn sang động cơ tween và để nó tiếp tục - phóng to về vị trí hiện tại của nhân vật.

+0

Chỉ cần để ghi lại (tôi nhận ra điều này đã được một thời gian trước đây) không có bạn sẽ không muốn sử dụng động cơ tween cho điều này vì nhân vật trò chơi luôn luôn di chuyển và dễ bị người dùng kiểm soát thay đổi hướng. Các chi phí của việc bắt đầu và giết chết tweens không có ý nghĩa. Đơn giản chỉ cần sử dụng thuật toán lerp ở trên trong cuộc gọi upd (delta). Điều đó nói rằng UTE rất tuyệt vời cho các quá trình chuyển đổi như vậy hoặc thậm chí cho việc di chuyển camera cho những thứ khác hơn là theo nhân vật trò chơi chính. – RichieHH

+0

Tôi không đồng ý. Trong khi tôi đã không thực hiện một phân tích thời gian, tweens được gộp lại để tác động của bắt đầu và giết chết nên được tối thiểu. Chỉ định một tween mới chỉ đơn giản là một tập hợp các nhiệm vụ và giết chết một tween tương tự như chỉ trả lại đối tượng trở lại hồ bơi. Tôi đã sử dụng cách tiếp cận này trong một trò chơi để giúp làm mịn chuyển động của camera hơn là khóa trực tiếp vào nhân vật mà không có tác động hiệu suất quan sát được. Thay vì chuyển động chập chờn, máy ảnh lười biếng theo sau người chơi trông đẹp mắt hơn rất nhiều. – MutantXenu

40

Hãy thử điều gì đó đơn giản như lerping một phần mười của khoảng cách. Nó hoạt động khá tốt.

float lerp = 0.1f; 
Vector3 position = this.getCamera().position; 
position.x += (Obj.x - position.x) * lerp * deltaTime; 
position.y += (Obj.y - position.y) * lerp * deltaTime; 
+16

Gợi ý: cũng nhân với thời gian delta để làm cho chuyển động độc lập với tốc độ khung hình. – Mortennobel