Nhảy bốc đồng


12

Có một điều khiến tôi bối rối, và đó là cách thực hiện bước nhảy 'giả tạo' trong một platformer. Nếu bạn không biết tôi đang nói về điều gì, thì hãy nghĩ đến những bước nhảy của Mario, Kirby và Trích dẫn từ Cave Story. Họ có đặc điểm gì chung? Chà, chiều cao của bước nhảy của bạn được xác định bởi thời gian bạn nhấn nút nhảy.

Biết rằng các 'xung lực' của các nhân vật này được xây dựng không phải trước khi họ nhảy, như trong vật lý thực tế, mà là trong khi ở giữa không trung - nghĩa là, bạn rất có thể nhấc ngón tay lên giữa chiều cao tối đa và nó sẽ dừng lại, ngay cả khi giải thích giữa nó và điểm dừng hoàn toàn; đó là lý do tại sao bạn có thể chỉ cần chạm vào một bước nhảy và giữ nó để nhảy xa -, tôi bị mê hoặc bởi cách họ giữ các phản lực của họ như những vòng cung.

Triển khai hiện tại của tôi hoạt động như sau:

nhập mô tả hình ảnh ở đây

Trong khi nhấn nút nhảy, trọng lực bị tắt và tọa độ Y của hình đại diện bị giảm đi bởi giá trị không đổi của trọng lực. Ví dụ: nếu mọi thứ giảm ở đơn vị Z trên mỗi đánh dấu, nó sẽ tăng đơn vị Z trên mỗi đánh dấu.

Khi nút được giải phóng hoặc đạt đến giới hạn, hình đại diện sẽ giải phóng một lượng sẽ khiến nó bao phủ các đơn vị X cho đến khi tốc độ của nó đạt đến 0; một khi nó làm, nó tăng tốc cho đến khi tốc độ của nó khớp với trọng lực - theo ví dụ, tôi có thể nói nó tăng tốc từ 0 đến Z đơn vị / đánh dấu trong khi vẫn bao phủ các đơn vị X.

Tuy nhiên, việc triển khai này làm cho các bước nhảy quá chéo và trừ khi tốc độ của avatar nhanh hơn trọng lực, điều này sẽ khiến nó đi quá nhanh trong dự án hiện tại của tôi (nó di chuyển với tốc độ khoảng 4 pixel mỗi tick và trọng lực là 10 pixel mỗi tick, tại tốc độ khung hình 40FPS), nó cũng làm cho nó thẳng đứng hơn so với chiều ngang. Những người quen thuộc với platformer sẽ nhận thấy rằng bước nhảy của nhân vật hầu như luôn cho phép họ nhảy xa hơn ngay cả khi họ không nhanh như lực hấp dẫn của trò chơi, và khi nó không, nếu không chơi đúng, sẽ tự chứng minh là như vậy rất phản trực giác. Tôi biết điều này bởi vì tôi có thể chứng thực rằng việc thực hiện của tôi rất khó chịu.

nhập mô tả hình ảnh ở đây

Có ai từng cố gắng ở cơ học tương tự, và thậm chí có thể thành công? Tôi muốn biết những gì đằng sau loại nhảy platformer này. Nếu bạn chưa từng có bất kỳ kinh nghiệm nào với việc này trước đây và muốn thực hiện nó, xin vui lòng, đừng cố gắng sửa chữa hoặc nâng cao việc thực hiện được giải thích của tôi, trừ khi tôi đang đi đúng hướng - hãy thử giải quyết từ vết trầy. Tôi không quan tâm nếu bạn sử dụng trọng lực, vật lý hoặc không có gì, miễn là nó cho thấy các xung giả này hoạt động như thế nào, nó thực hiện công việc.

Ngoài ra, tôi muốn bản trình bày của nó để tránh mã hóa theo ngôn ngữ cụ thể; như, chia sẻ cho chúng tôi một ví dụ về C ++ hoặc Delphi ... Nhiều như tôi đang sử dụng khung XNA cho dự án của mình và không bận tâm đến công cụ C #, tôi không đủ kiên nhẫn để đọc mã của người khác và tôi một số nhà phát triển trò chơi của các ngôn ngữ khác sẽ quan tâm đến những gì chúng tôi đạt được ở đây, vì vậy đừng bận tâm đến mã giả.

Cảm ơn bạn trước.


3
Bạn đã xem câu hỏi sau đây và (các) câu trả lời chưa? gamedev.stackexchange.com/questions/29617/
Google

@bummzack Điều này cũng rất rõ ràng.
Mutoh

1
có thể trùng lặp khả năng xử lý Jump và lực hấp dẫn Mặc dù nó không có hình ảnh đẹp, nhưng đó là câu hỏi tương tự.
MichaelHouse

Câu trả lời:


8

Tôi nghĩ vấn đề chính của bạn nằm ở đây:

Trong khi nhấn nút nhảy, trọng lực bị tắt và tọa độ Y của hình đại diện bị giảm đi bởi giá trị không đổi của trọng lực. Ví dụ: nếu mọi thứ giảm ở đơn vị Z trên mỗi đánh dấu, nó sẽ tăng đơn vị Z trên mỗi đánh dấu.

Trọng lực không hoạt động như thế. Google "chuyển động tăng tốc đồng đều" cho các chi tiết, nhưng nói một cách đơn giản, như một thành viên khác nói, trọng lực là một gia tốc, không phải là vận tốc.

Nói một cách đơn giản, trong khi vận tốc là tốc độ thay đổi vị trí không đổi theo thời gian, gia tốc là tốc độ thay đổi không đổi của vận tốc theo thời gian.

Vì vậy, thứ tự kinh doanh đầu tiên của bạn sẽ là thay đổi thuật toán rơi của bạn để bao gồm cả gia tốc, không chỉ là vận tốc. Thay vì:

pos_y = pos_y + (velocity_y * time_difference)

bạn sẽ phải làm một cái gì đó như

pos_y = pos_y + (velocity_y * time_difference) + (gravity_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (acceleration_y * time_difference)

Bằng cách đó, mọi thứ sẽ rơi vào một parabola, đó là chuyển động chính xác về mặt vật lý.

Bây giờ, để thực hiện bước nhảy đơn giản (chúng tôi sẽ nhận được câu hỏi chính xác của bạn ngay sau đó), bạn chỉ cần đặt velocity_ythành một giá trị mong muốn. Miễn là dấu hiệu acceleration_yvà mong muốn của bạn velocity_ykhác nhau, đối tượng của bạn sẽ nhảy chính xác (Nói cách khác, bạn không "tắt trọng lực". Bạn tiếp tục và chỉ cần đặt vận tốc của đối tượng thành một giá trị được xác định trước).

Bạn sẽ nhận thấy rằng càng lớn velocity_ykhi bạn bắt đầu nhảy, bước nhảy sẽ càng cao. Vì vậy, để thực hiện hiệu ứng mong muốn của bạn, bạn thêm một số loại gia tốc cho bước nhảy (về mặt vật lý, điều này có nghĩa là thêm một lực. Hãy nghĩ đến việc thêm một tên lửa nhỏ vào đối tượng).

Để làm điều này, bạn làm điều tương tự như trước đây, nhưng bây giờ gia tốc và vận tốc phải có cùng một dấu hiệu. Bạn làm điều này trong khi nhấn nút:

pos_y = pos_y + (velocity_y * time_difference) + (force_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (force_y * time_difference)

4

Giải pháp là không trì hoãn việc giảm tốc. Khi bạn ném một quả bóng lên không trung, nó không di chuyển với tốc độ không đổi cho đến khi đạt được độ cao tối đa, nhưng giảm tốc từ thời điểm thúc đẩy.

Trọng lực không phải là vận tốc, mà là gia tốc. Vì vậy, nếu người chơi có tốc độ lên tới 20 đơn vị và trọng lực là -10 đơn vị, ở lần đánh dấu tiếp theo, tốc độ tăng lên sẽ là 10 đơn vị, trên đơn vị tiếp theo, 0 đơn vị, v.v.

Lý do tại sao các bước nhảy của bạn có vẻ rất chéo là vì tốc độ lên xuống của người chơi của bạn là không đổi. Vì vậy, nếu bạn thực sự vẽ một đường theo đường dẫn của người chơi, bạn sẽ thấy một đường có độ dốc, dương hoặc âm, giá trị trọng lực của bạn so với thay đổi ở vị trí x.

Để người chơi của bạn kiểm soát độ cao của bước nhảy của bạn, người chơi của bạn nên được cung cấp một số vận tốc ban đầu theo xung lực, nên tắt trọng lực và giá trị trọng lực đặc biệt (nhỏ hơn trọng lực thông thường) nên được áp dụng cho vận tốc của người chơi. Khi nút nhảy được giải phóng hoặc vận tốc của người chơi đạt 0, trọng lực bình thường sẽ được áp dụng.

Bằng cách này, người chơi sẽ thấy một đường cong đẹp trong khi nhảy, cho dù họ có giảm tốc bằng trọng lực thông thường hay không.


2

Câu chuyện ngắn là: bạn sẽ có một phần không parabol trong vòng cung nhảy của bạn ở đâu đó.

Tôi đã thử một vài cách tiếp cận khi thực hiện nhảy:

  • Leo lên liên tục: Điều này dường như là, thực tế, là những gì bạn đang cố gắng: cố định vận tốc dọc dương cho đến khi nút được thả ra, tại đó trọng lực bình thường sẽ nhảy vào. Vòng cung nằm chéo trên cao, nhưng bình thường vào mùa thu - điều này thực sự bình thường có vẻ ổn, và (quan trọng hơn) cảm thấy ổn, vì nó khá dễ dàng để đánh giá chiều cao của bước nhảy tốt.

  • Leo núi bị bắt giữ: Đây là nơi bạn bắt đầu nhân vật tăng dần ở parabola có chiều cao tối đa, áp dụng một xung lực ban đầu. Sau đó, khi nút được nhả, bạn đặt vận tốc dọc thành 0 (hoặc tốc độ hướng lên nhỏ). Điều này có nghĩa là bước nhảy lớn nhất của bạn là một parabola được đảm bảo và những bước nhảy nhỏ hơn có cảm giác giống như bạn đang thực hiện một bước nhảy lớn sau đó chậm lại.

  • Biến xung ban đầu: Đây là lần cuối cùng tôi chọn: nhấn nhảy sẽ áp dụng một xung hướng lên ban đầu đủ cho một bước nhảy, và sau đó tiếp tục áp dụng gia tốc hướng lên (lớn hơn nhiều so với trọng lực) trong một khoảng thời gian ngắn - cửa sổ nhảy - cho đến khi nút đã được phát hành. Khi cửa sổ nhảy đóng lại, chuyển động sẽ là parabol và khoảng thời gian xung ban đầu biến đổi đủ ngắn để nó trông không kỳ lạ, nhưng đủ dài để cung cấp cho người chơi có kinh nghiệm đủ phạm vi để kiểm soát chiều cao bước nhảy. Nhược điểm là không dễ để đánh giá chiều cao bước nhảy, vì cửa sổ nhỏ hơn nhiều và không có sự tương ứng của thời điểm phát hành với chiều cao. Vì nó đã xảy ra hầu hết thời gian bạn muốn một cú chạm hoặc nhảy hoàn toàn, vì vậy đó không phải là một vấn đề như vậy.

Hãy thử những điều này và xem cảm thấy tốt nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.