Trong một trò chơi nền tảng 2D, làm thế nào để đảm bảo người chơi di chuyển trơn tru trên mặt đất dốc?


18

Tôi đang phát triển một công cụ vật lý cho một trò chơi nền tảng 2D. Tôi đang sử dụng định lý trục tách để phát hiện va chạm. Bề mặt đất được xây dựng từ các hộp giới hạn định hướng, với đầu phát là hộp giới hạn căn chỉnh trục. (Cụ thể, tôi đang sử dụng thuật toán từ cuốn sách "Phát hiện va chạm trong thời gian thực" để thực hiện phát hiện va chạm quét cho OBBs bằng SAT). Tôi đang sử dụng một hệ số phục hồi khá nhỏ (gần bằng 0) trong phản ứng va chạm, để đảm bảo rằng các đối tượng động không xâm nhập vào môi trường.

Động cơ chủ yếu hoạt động tốt, chỉ là tôi lo ngại về một số trường hợp cạnh có thể xảy ra. Ví dụ, trong sơ đồ, A, B và C là mặt đất. Người chơi đang đi bên trái dọc theo B về phía A. Dường như với tôi là do không chính xác, hộp người chơi có thể hơi nằm dưới hộp B khi nó tiếp tục đi lên và rời đi. Do đó, khi đến A, góc dưới bên trái của người chơi có thể va chạm với bên phải của A, điều này là không mong muốn (vì ý định là để người chơi di chuyển trơn tru trên đỉnh A). Có vẻ như một vấn đề tương tự có thể xảy ra khi người chơi ở trên đỉnh hộp C, di chuyển sang trái về phía B - điểm cực đoan nhất của B có thể va chạm với phía bên trái của người chơi, thay vì góc dưới bên trái của người chơi trượt lên và sang trái trên B.

Box2D dường như xử lý vấn đề này bằng cách lưu trữ thông tin kết nối cho các hình dạng cạnh của nó, nhưng tôi không thực sự chắc chắn cách nó sử dụng thông tin này để giải quyết vấn đề và sau khi xem mã tôi không thực sự nắm bắt được nó đang làm gì.

Bất kỳ đề xuất sẽ được đánh giá rất cao.


Một công cụ vật lý nói chung là tuyệt vời cho các hiệu ứng và hộp rơi và tất cả những thứ đó, nhưng không phải cho vật lý nhân vật, như được trình bày trong phần trả lời. Cân nhắc viết vật lý "tĩnh" cho nhân vật của bạn, để bạn có thể kiểm soát 100% và sử dụng động lực mô phỏng đúng cho phần còn lại.
Domi

Câu trả lời:


14

Nền tảng và Vật lý

Những trường hợp cạnh rất nhiều. Những người chơi platformer vui vẻ không hành xử theo bất kỳ cách chính xác nào về mặt vật lý, và sự kiểm soát cũng như hành vi mà người chơi mong đợi sau nhiều năm của những người chơi platformer "hoàn hảo" như Mario rất khó thực hiện với các kỹ thuật chung như bạn có với Box2D hoặc các động cơ vật lý khác. Hầu hết các nền tảng tốt không sử dụng bất kỳ loại vật lý chung hoặc phản ứng va chạm nào trong bộ điều khiển trình phát của họ.

Tạo thân tàu

Liên quan đến câu hỏi cụ thể của bạn, giải pháp tốt nhất là ngừng sử dụng các hộp làm mặt bằng của bạn. Sử dụng một loạt các đoạn đường được kết nối (một thân tàu). Điều đó cho phép động cơ phát hiện va chạm chỉ tập trung vào các bề mặt thực sự có thể đi bộ và không nhìn vào cạnh "giả" tồn tại giữa AB và BC. Đó là những gì Box2D làm, trên thực tế. Các hình dạng được sử dụng để tạo ra các bề mặt bên ngoài, được liên kết với nhau để tạo thành một thân tàu.

Bạn cần điều này ngay cả trong các trò chơi xếp gạch, hoặc trong các tình huống mà bạn có hai đối tượng AABB bên cạnh hoạt động khác như sàn. Động cơ va chạm sẽ nhặt những cạnh thẳng đứng đó và khiến người chơi bắt chúng. Có những hack có thể giúp đỡ, nhưng không loại bỏ vấn đề. Giải pháp là chỉ có một phân đoạn dòng duy nhất đại diện cho bề mặt chứ không phải là một hộp 2D đầy đủ.

Bạn có thể tạo các thân tàu trong trường hợp chung bằng cách cắt các đa giác với nhau và nối các điểm clip vào một danh sách cạnh.

Bề mặt dốc

Vì ví dụ của bạn bao gồm độ dốc và bạn đang đề cập đến sự phục hồi và các thuộc tính vật lý khác, tôi sẽ chỉ ra một vài vấn đề khác mà bạn sẽ sớm nhận thấy, điều này minh họa thêm tại sao phát hiện và phản ứng va chạm chung không hoạt động tốt cho các nền tảng. Đầu tiên, hãy thử đứng trên bục góc, nhảy lên, và sau đó hạ cánh. Bạn có thể sẽ nhận thấy rằng nhân vật sẽ "trượt" một chút khi hạ cánh. Vấn đề là liên hệ bình thường mà bạn tạo ra thường sẽ được chỉ ra từ bề mặt góc cạnh. Sau đó, khi giải quyết va chạm, người chơi bị đẩy ra theo hướng đó. Mặc dù nhân vật rơi thẳng xuống, anh ta sẽ bị đẩy lên và một chút về bên phải khi hạ cánh, dẫn đến trượt. Điều này có thể bị hack bằng cách tính đến vận tốc tương đối,

Vấn đề thứ hai bạn sẽ chú ý, khó khắc phục hơn nhiều, đó là những gì xảy ra khi bạn cố gắng chạy nhanh xuống một đoạn đường dốc. Người chơi sẽ "nhảy" xuống đoạn đường nối. Điều này rất dễ thấy ngay cả trong hầu hết các game AAA hiện nay. Nó không chỉ trông ngớ ngẩn, mà nếu trò chơi của bạn yêu cầu người chơi phải đứng trên mặt đất để nhảy, điều đó gây khó khăn khi chạy xuống một đoạn dốc và nhảy xuống một nửa, bởi vì người chơi chỉ tiếp xúc với đoạn đường nối trong một phần nhỏ của thời gian đi xuống nó Cách khắc phục đơn giản hơn là chỉ cần thực hiện một số động tác phát tia khi người chơi di chuyển và đưa vị trí người chơi xuống bề mặt gần nhất (nếu nó rất gần với người chơi) nếu người chơi không nhảy và trước đó đã ở trên mặt đất.

Bạn cũng có thể thấy rằng người chơi phóng lên không trung khi chạy lên đoạn đường dốc nếu bạn cố gắng mô hình vận tốc, ma sát và phục hồi trên người chơi như thể anh ta là một cơ thể cứng nhắc bình thường. Chuyển động của người chơi nên bị hạn chế chuyển động ngang trừ khi ngã / nhảy. Tất nhiên, nếu bạn chơi platformer thời kỳ hoàng kim cũ hơn, bạn có thể nhận thấy rằng vận tốc ngang của người chơi thường không đổi giữa các bề mặt ngang và dốc. Điều này cần phải được tính đến khi đi lên / xuống dốc.

Sẽ có một số trường hợp góc kỳ lạ khác cuối cùng bạn cũng sẽ gặp phải. Nếu bạn đang cố gắng tạo ra một nền tảng tốt, tốt nhất là thực hiện bộ điều khiển trình phát nền tảng tách biệt với vật lý và mã hóa hành vi điều khiển và chuyển động mà bạn muốn, thay vì dựa vào thuật toán vật lý chung và phản ứng va chạm.


Cảm ơn vì đã trả lời. Tôi đã cân nhắc việc giảm các ô đại diện cho mặt đất thành các dòng, nhưng tôi thực sự không nghĩ rằng chính nó sẽ khắc phục vấn đề. Ví dụ: nếu các hộp tiếp đất bây giờ là các dòng và nếu người chơi đứng trên dòng C và di chuyển sang trái về B, do không chính xác, có thể hộp người chơi hơi nằm dưới dòng C. Sau đó, cạnh trái của hộp trình phát vẫn có thể va chạm với dòng B và gây ra vụ va chạm không mong muốn đó,
Nick Kovac

trừ khi có một số cơ chế khác để ngăn chặn điều này xảy ra. Không phải thực tế là Box2D sử dụng các dòng thay vì các hộp khắc phục sự cố, đó là Box2D sử dụng hình dạng chuỗi, sử dụng thông tin kết nối giữa các phân đoạn dòng để ngăn một số va chạm xảy ra. Vấn đề chính tại thời điểm này là tôi không hiểu chi tiết về cách chính xác nó làm điều này.
Nick Kovac

Bạn đã nêu ra một số điểm thực sự tốt khác về các vấn đề với việc lấy ý tưởng từ các công cụ vật lý chung và áp dụng chúng vào các trò chơi nền tảng. Tôi đã thấy các công cụ tương tự thực hiện các ý tưởng mà bạn đã thảo luận (sửa đổi va chạm bình thường đối với sườn dốc và hút người chơi lên dốc), vì vậy ít nhất những vấn đề đó khá dễ giải quyết. Điểm gắn bó chính đối với tôi là các trường hợp khó khăn liên quan đến lỗi số.
Nick Kovac

@Kovsa: một lần nữa, những lỗi cụ thể đó sẽ biến mất khi bạn thoát khỏi các cạnh không phải là một phần của vụ va chạm ở nơi đầu tiên. Xâu các cạnh lại với nhau để tạo thành một hình dạng không bị gián đoạn. Khi thiết kế cấp độ của bạn, tôi cũng khuyên bạn nên chụp các đỉnh lại với nhau để bạn không có bất kỳ kẽ hở nhỏ nào trên bề mặt. Không có gì khác biệt thực sự so với cách bạn thiết kế cấp độ trong trình chỉnh sửa lưới 3D.
Sean Middleditch

Hmm ... tôi không nghĩ rằng tôi làm theo. Trong sơ đồ của tôi, nếu tôi xâu các cạnh lại với nhau để tạo thành một hình dạng không bị gián đoạn, tôi sẽ có được một hình bao gồm ba đoạn đường: đỉnh của các hộp A, B và C, phải không? Mặc dù đó là một hình dạng duy nhất, tôi vẫn sẽ cần thực hiện phát hiện va chạm riêng biệt với dòng A, sau đó là B, sau đó là C? Trừ khi bạn có nghĩa là một thuật toán có thể phát hiện sự va chạm giữa hộp và hình dạng kết hợp này? Tôi cho rằng đó sẽ không phải là SAT sau đó, vì một loạt các cạnh có thể bị lõm?
Nick Kovac

5

Tôi nghĩ rằng cả hai vấn đề có thể được giải quyết bằng cách xử lý các hộp của bạn, cho mục đích phản ứng va chạm, như thể chúng có các góc tròn (có bán kính tương tự như lỗi số của bạn). Điều này sẽ làm cho bề mặt kết hợp hiệu quả của các góc gặp gỡ giữa A và B, và B và C, mịn hơn.

Do đó, nếu PLAYER di chuyển sang trái chạm vào góc A, va chạm bình thường sẽ là đường chéo chứ không hoàn toàn là phải, do đó cho phép tiếp tục chuyển động từ trái sang phải.


Tuy nhiên, một giải pháp điển hình hơn, khi xem xét những gì tôi biết về vật lý platformer, là làm cho người chơi có hình dạng tròn cao hơn và để địa hình một mình. Cụ thể, hãy xem xét làm cho hình dạng của người chơi thành một viên nang (vòng tròn kéo dài ở giữa (2D) / hình cầu (3D)) - sau đó các quy tắc va chạm của bạn sẽ tự nhiên gần như thẳng đứng, loại bỏ mọi vấn đề bắt.

Bạn nói rằng bạn đang sử dụng thuật toán va chạm dành riêng cho OBB, nhưng bạn vẫn có thể, sau khi tìm thấy xung đột OBB-OBB, hãy sử dụng thử nghiệm thêm đối với hình dạng hoàn toàn trong OBB.


Hmm, ý tưởng thú vị ... bạn sẽ thực hiện nó như thế nào? Mặc dù vậy, điều này đi ngược lại với sự đơn giản của việc sử dụng các hộp: (Tôi đồng ý rằng có vẻ như đó là một vấn đề phổ biến với một giải pháp dứt khoát, nhưng tôi không thể tìm thấy bất kỳ sự bảo hiểm nào về nó thực sự ... ngoài những gì đang được thực hiện trong Box2D. Tôi đã đăng một câu hỏi tương tự trên diễn đàn của họ để hy vọng có được cái nhìn sâu sắc hơn.
Nick Kovac

Tôi không có bất kỳ chi tiết triển khai nào, xin lỗi - Tôi không phải là chuyên gia về loại mã động cơ vật lý này. Tuy nhiên, tôi đã có một ý tưởng tốt hơn cho một giải pháp không dựa trên các yếu tố mờ nhạt - xem phần chỉnh sửa của tôi.
Kevin Reid

1
Lưu ý rằng trong khi sử dụng các hình tròn làm việc, cả hai đều phức tạp hơn về mặt toán học và nó có thể dẫn đến hành vi không tối ưu cho các nền tảng. Ví dụ, người chơi mong muốn có quyền kiểm soát pixel hoàn hảo đối với các nhân vật đứng trên các gờ, ví dụ, hình dạng tròn sẽ làm cho ít nhiều không thể, và các nhân vật sẽ trượt khỏi các cạnh bất ngờ.
Sean Middleditch

Các gờ: D'oh! OK, không đơn giản như tôi nghĩ.
Kevin Reid

Vâng, sau khi suy nghĩ về nó, cách tiếp cận con nhộng có lẽ phù hợp hơn với một trò chơi 3D hơn là một nền tảng 2D. Có pixel kiểm soát hoàn hảo chắc chắn là ưu tiên hàng đầu của tôi (như trong tất cả các nền tảng 2D cũ). Nhưng phải có một giải pháp cho phép sử dụng hộp!
Nick Kovac
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.