Chọn gạch dựa trên gạch liền kề


10

Tôi đang làm việc trên một trình chỉnh sửa bản đồ lát gạch và tôi cần chọn các ô tự động, dựa trên các ô liền kề. Ví dụ, khi đặt một lát đường, bên cạnh một lát đường khác, hai cần phải được định hướng để chúng tạo thành một con đường liên tục. Nếu có những con đường khác xung quanh chúng, chúng ta có thể cần sử dụng gạch góc hoặc ngã tư.

Bất cứ ai có thể đề nghị một số thuật toán để làm điều này? Trò chơi sử dụng bản đồ lát gạch vuông 8 hướng.


Bạn không thể kiểm tra tất cả 8 ô xung quanh bất cứ khi nào người dùng đặt một ô mới và định hướng ô mới phù hợp? Tất nhiên, bạn sẽ cần lưu trữ một số thông tin bổ sung trên mỗi ô như định hướng và loại.
XiaoChuan Yu

Tôi đang kiểm tra tất cả các ô xung quanh, nhưng tôi không biết cách xử lý tất cả các kết hợp gạch. Ví dụ: bạn có bảy ô có thể chọn (ngang, dọc, bốn góc và chéo). Tôi đã nghĩ đến việc sử dụng các câu lệnh chuyển đổi phức tạp, nhưng điều đó cảm thấy sai.
alekop

Câu trả lời:


18

Có lẽ đây là cách nó thường được thực hiện. Bạn có danh sách các ô khác nhau đại diện cho các ô đường theo tất cả các hướng có thể có của chúng. Trái sang phải, tất cả bốn góc, từ trên xuống dưới, bất cứ điều gì. Bây giờ bạn sẽ lập chỉ mục tất cả các ô đó với mỗi byte. 8 bit, một bit cho mỗi hướng. Điều này có thể trong một hashmap hoặc theo tên tệp ... tuy nhiên bạn muốn làm điều này.

Vì vậy, bạn có điều này:

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

Mã byte cho ô trên là 00000000 . Sau đó, ô của bạn đi từ trái sang phải (hoặc phải sang trái) là như thế này:

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

Mã byte cho ô đó là 10001000 hoặc 136. Như một ví dụ khác, hãy xem xét giao lộ ba chiều:

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

Mã byte cho ô đó là 10101000 .

Bạn có thể thấy nơi tôi đang đi. Bạn đặt vị trí bit trong byte đại diện cho các kết nối. Điều này tốt hơn nhiều so với việc cố gắng thực hiện một số chuỗi lớn nếu / khác mà tôi đã thấy trước đây. Khi bạn đang tìm cách đặt một ô, kiểm tra các ô xung quanh nó và tạo một byte trên đường đi. Đặt 1 cho các ô có đường (hoặc bất cứ thứ gì bạn muốn kết nối) và 0 cho các ô không có. Khi bạn hoàn thành, bạn sẽ có mã byte cho ô chính xác mà bạn cần.

Lưu ý rằng khi tạo tài sản, bạn có thể sử dụng lại rất nhiều trong số chúng bằng cách xoay và gán mã byte chính xác cho nó.

EDIT : Cập nhật hình ảnh để bớt crappy. Vâng, đó là tốt hơn so với trước đây.


Rất đẹp! Đơn giản và hiệu quả. Điều duy nhất tôi không hiểu là làm thế nào bạn có được những bitmasks đó. Ví dụ, làm thế nào bạn nhận được bitmask 17 từ các số 3 và 7?
alekop

Đừng bận tâm, tôi thấy những gì bạn đang làm. Bạn đang thiết lập bit 3 và 7, nhưng bạn đang đếm từ bên trái, thay vì bên phải.
alekop

Ôi chao, thật xấu hổ. Có tất cả Endianness của tôi trộn lẫn. Đó là một tai nạn tôi sẽ sửa nó!
MichaelHouse

Tuyệt, giờ bình luận của tôi không có ý nghĩa! : p Đùa thôi, cảm ơn câu trả lời của bạn. Đó chính xác là những gì tôi đang tìm kiếm.
alekop

1
Lời giải thích hay. Tôi có một bài đăng trên blog về kỹ thuật tương tự với độ phân giải mã và gạch thực tế: Kitsu.github.io/2016/07/18/roguelike-project-05
Kitsu.eb

3

Tôi khuyên bạn nên xem trang tiện dụng này để biết thêm thông tin, vì nó đi sâu vào chi tiết tuyệt vời về hầu hết mọi khía cạnh của những gì bạn đang làm, cũng như một vài tối ưu hóa tiềm năng: http://www.angryfishstudios.com / 2011/04 / cuộc phiêu lưu trong bitmasking /

Tldr là bạn truy vấn từng ô liền kề và lưu trữ kết hợp trong bitfield / byte, sau đó chuyển nó qua bản đồ chuyển đổi một số từ 0 ~ 255 thành giá trị từ 0 ~ 47, tương ứng với một hình ảnh duy 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.