Sidescroller chiều cao địa hình thay đổi để đi bộ / va chạm


7

Tôi đã bị lừa khi di chuyển trên các gạch dốc trong XNA và nó đang hoạt động nhưng không hoàn toàn thỏa đáng. Tôi cũng đã nghĩ rằng việc có những bộ dốc được xác định trước có thể không cho tôi địa hình trông đủ "hữu cơ". Ngoài ra còn có vấn đề phải xây dựng một số loại gạch khác nhau cho mỗi độ dốc khi chúng bị xích lại với nhau (chỉ gạch 45 độ sẽ xâu chuỗi hoàn hảo như tôi hiểu).

Tôi đã nghĩ đến việc bằng cách nào đó quét các chuỗi gạch dốc được kết nối và coi nó như một hình tam giác lớn mới, vì tôi gặp khó khăn khi bị trục trặc ở các cạnh nơi gạch dốc kết nối. Nhưng, điều này dẫn đến vấn đề hạn chế độ cong của địa hình.

Vì vậy, ... những gì tôi muốn làm bây giờ là tạo một hình ảnh hoặc kết cấu đơn giản về địa hình của một cấp độ (hoặc phần của cấp độ) và tạo một sơ đồ chiều cao đơn giản (của Y cho mỗi X) cho địa hình. Vị trí Y của người chơi sau đó sẽ được cập nhật dựa trên vị trí X của họ.

Có một cách đơn giản để làm điều này (hoặc một cách tốt hơn để giải quyết vấn đề này)? Vấn đề chính tôi có thể thấy với phương pháp này là trường hợp có những khu vực trên mặt đất có thể đi được. Có lẽ có một cách để chỉ bản đồ tất cả các khu vực mặt đất có thể đi bộ?

Tôi đã xem xét đoạn mã hữu ích này: http://thirdpartyninjas.com/blog/2010/07/28/sloped-pl platform-collision / nhưng cần một cách để tạo các điểm / vectơ thực tế.

EDIT: Tôi đã thử tạo trước các đường dốc bằng cách sử dụng liên kết tôi đã đăng nhưng bây giờ tôi tin rằng tôi nên sử dụng xung đột trên mỗi pixel như bạn đề xuất. Tôi đã xem ví dụ tại: http://create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel và đang cố gắng tìm ra cách điều chỉnh sprite sau khi phát hiện va chạm. Như David đề xuất, tôi đã tạo ra một vài điểm cảm biến (chân, hai bên, trung tâm dưới cùng, v.v.) và có thể dễ dàng phát hiện khi những điểm này thực sự va chạm với các phần không trong suốt của kết cấu thứ hai (độ dốc đơn giản). Tôi gặp rắc rối với thuật toán về cách tôi thực sự điều chỉnh vị trí sprite dựa trên va chạm.

Nói rằng tôi phát hiện một vụ va chạm với độ dốc ở chân phải của sprite. Làm cách nào tôi có thể quét dữ liệu kết cấu độ dốc để tìm vị trí Y để đặt chân của sprite để nó không còn bên trong độ dốc? Cách nó được lưu trữ dưới dạng mảng 1D trong ví dụ hơi khó hiểu, tôi có nên cố gắng lưu trữ dữ liệu dưới dạng mảng 2D không?

Tôi cũng nhận thấy một số người đề cập rằng tốt nhất nên tách kiểm tra va chạm theo chiều ngang và chiều dọc, tại sao lại chính xác như vậy?

Câu trả lời:


12

Tôi không nghĩ bạn nên thử chuyển đổi toàn bộ bản đồ thành một bản đồ chiều cao duy nhất, chính xác là do vấn đề bạn mô tả. Bản đồ có thể có độ phức tạp tùy ý mà bạn không thể thể hiện trong bản đồ chiều cao.

Nhưng bạn không cần phải có độ dốc cố định cho từng loại gạch. Bạn có thể lưu trữ thông tin va chạm trên cơ sở từng pixel cho từng loại ô hoặc tính toán từ kênh alpha của ô đó và sử dụng thông tin đó để xác định vị trí của nhân vật tại mỗi thời điểm dựa trên các ô mà anh ta hiện đang giao nhau. Đây là một ví dụ về dữ liệu va chạm cho một ô:

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

Sử dụng sơ đồ này, bạn có thể có bất kỳ loại độ dốc nào bạn muốn chỉ bằng cách thay đổi mặt nạ va chạm của gạch. Đây là cách trò chơi Sonic được triển khai trở lại trong ngày và vì vậy tôi khuyên bạn nên đọc toàn bộ trang sau để hiểu rõ hơn:

http://info.sonicretro.org/SPG:Solid_Tiles#Slopes_And_Curves

Sau đó, để xử lý các va chạm giữa nhân vật của bạn và môi trường, tôi khuyên bạn nên xác định một vài cảm biến hoặc điểm va chạm trên nhân vật của mình, chẳng hạn như các chấm màu đỏ tươi trên hình ảnh bên dưới:

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

Ví dụ, các cảm biến trên cùng có thể được sử dụng để phát hiện và phản ứng với các va chạm với trần nhà, các cảm biến ở giữa có thể được sử dụng để phát hiện và phản ứng với các va chạm với tường và các cảm biến phía dưới có thể được sử dụng để phát hiện va chạm với sàn và xác định chiều cao chính xác cho người chơi. Bằng cách di chuyển các cảm biến ở giữa lên và xuống, bạn có thể kiểm soát độ dốc phải như thế nào trước khi người chơi không thể leo lên được nữa.

Một mẹo nhỏ khác bạn có thể làm với các cảm biến phía dưới, tùy thuộc vào số lượng chúng đang va chạm với sàn nhà, bạn có thể phát hiện khi người chơi ở gần gờ và có thể phát một hình ảnh động khác như hình ảnh bên dưới.

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


Cảm ơn bạn đã phản hồi, tôi đã thử một cách tiếp cận khác với việc hình thành các đường dẫn được tạo sẵn nhưng hiện đang thử nó. Tôi đã chỉnh sửa bài viết trên của mình nhưng đó thực sự là một câu hỏi khác vì vậy tôi sẽ đăng nó dưới dạng một câu hỏi riêng biệt.
JiminyCricket
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.