Tạo các điểm nóng không phải hình chữ nhật và phát hiện các nhấp chuột


7

Nói về một trò chơi có các điểm nóng bất thường (nói Rủi ro, hoặc một trò chơi chiến lược như Paradox's Hearts of Iron hoặc Crusader Kings), bạn thế nào

  1. Xác định một điểm nóng không phải hình chữ nhật có hình dạng bất thường (giống như một lãnh thổ trên bản đồ?), Trong mã?

  2. Công cụ nào bạn có thể sử dụng để theo dõi điểm nóng và nhập vào trò chơi của mình?

  3. Thuật toán để phát hiện nếu ai đó đã nhấp vào trong một điểm nóng như vậy là gì?

Câu trả lời:


9

Bên cạnh cách tiếp cận vectơ / đa giác, một cách khác để làm điều này là sử dụng bitmap.

Nếu mỗi "màu" trong bitmap đại diện cho một lãnh thổ (Pháp, Bỉ, v.v.), thì đó chỉ đơn giản là vấn đề tìm ra pixel nào trong bitmap được nhấp, tìm màu và xác định xem màu đó có đại diện cho lãnh thổ quan tâm không. Bạn thậm chí có thể đại diện cho các lãnh thổ chồng chéo với màu sắc cụ thể hoặc coi màu sắc của bạn là bitmask của lãnh thổ.

Về các công cụ, hãy để các nghệ sĩ / nhà sản xuất nội dung của bạn tạo ra bitmap trong bất kỳ công cụ chỉnh sửa pixel nào. Ví dụ: nếu bạn sử dụng Photoshop hoặc Gimp, bạn có thể đại diện cho các lãnh thổ khác nhau (Pháp, Bỉ, v.v.) dưới dạng các lớp được đặt tên hoặc 1 lớp nhưng phân biệt các lãnh thổ dựa trên màu sắc. Sau đó, bạn sẽ viết một công cụ để chuyển đổi hình ảnh / lớp thành định dạng phù hợp cho các mục đích nội bộ trò chơi.

Định dạng nội bộ của trò chơi rất có thể sẽ được nén theo chiều dài mỗi hàng (xem: http://en.wikipedia.org/wiki/Run-length_encoding ). Bạn sẽ có thể đạt được tỷ lệ nén rất tốt theo cách này, vì các pixel liền kề trên các hàng sẽ rất thường thuộc về cùng một lãnh thổ. Sau đó, thuật toán trở thành tọa độ y hiện tại của chuột, đi qua hàng đó và tìm ra nó chạy thuộc về vùng nào, và do đó là lãnh thổ tương ứng.


Đã sắp viết một cái gì đó tương tự, điều này dễ hơn là chơi với đa giác.
aaaaaaaaaaaa

Vâng, bạn cũng có được pixel chính xác hoàn hảo. Lộn xộn với đa giác chỉ là một mớ hỗn độn.
Michael Coleman

2
+1 (vì đó là một giải pháp dễ dàng và nhanh chóng), mặc dù nó sẽ sử dụng nhiều dữ liệu hơn và có thể không độc lập với độ phân giải như cách tiếp cận đa giác.
bummzack

đây là một lời giải thích chính xác về kỹ thuật: xnaresource.com/default.asp?page=Tutorial:ColorKeyMap
HuseyinUslu

Bạn có thể sử dụng một chương trình vector như inkscape để tạo mặt nạ. Điều này mang lại cho bạn lợi thế là có thể tạo / chỉnh sửa bản đồ từ / với đa giác & các lớp trong khi cung cấp khả năng xuất dễ dàng sang ví dụ * .bmp
Exilyth

7

Bạn sẽ cần xác định các điểm nóng là một chuỗi các đa giác che phủ hình ảnh của bạn. Sau đó, khi người dùng nhấp vào bản đồ, hãy đi qua danh sách đa giác (điểm nóng có thể nhấp) và xem điểm nào (nếu có) điểm nhấp chuột nằm trong.

Ngoài ra, bạn có thể xem xét cách thực hiện các hình ảnh trong HTML. Không phải là bạn sẽ làm việc với HTML, nhưng về cơ bản chúng là những gì bạn muốn thực hiện. Chúng cho phép xác định các điểm nóng là hình chữ nhật, hình tròn và đa giác (đó là những gì bạn muốn).

Đây là một trang web mô tả bản đồ hình ảnh HTML có thể cung cấp cho bạn một số ý tưởng: http://www.javascriptkit.com/howto/imagemap.shtml

Đây là một bài viết trên Wikipedia về các thuật toán để cho biết một điểm có nằm trong đa giác hay không: http://en.wikipedia.org/wiki/Point_in_polygon



1

Đối với loại điều này, chúng tôi sử dụng một hình ảnh được sử dụng làm mặt nạ, với các pixel trong suốt / mờ hoặc đen / trắng. Các mặt nạ không được vẽ, nhưng về mặt khái niệm là "được đặt" trên khu vực bản đồ mà chúng bao phủ.

Khi bạn nhận được một nhấp chuột, đầu tiên hãy kiểm tra hộp giới hạn của hình ảnh. Nếu nó ở bên ngoài, người chơi đã không nhấp vào khu vực. Nếu nó ở bên trong, hãy kiểm tra pixel. Nếu nó trong suốt / đen, người chơi đã không nhấp vào khu vực. Nếu không, anh đã làm.

Nếu việc sử dụng bộ nhớ là một mối quan tâm nghiêm trọng, bạn có thể sử dụng hình ảnh có kích thước bằng một nửa và áp dụng màn hình phù hợp để chuyển đổi tọa độ hình ảnh. Bạn sẽ không nhận được phát hiện pixel hoàn hảo nhưng có lẽ bạn không cần nó trong trường hợp này.

Ngoài ra, nếu bạn đi trong suốt / mờ đục, hãy lưu mặt nạ dưới dạng PNG (hoặc bất kỳ sơ đồ nén không mất dữ liệu nào khác) hoặc sử dụng ngưỡng cao (alpha> 128 thay vì alpha> 0). Mặt khác, các tạo phẩm JPEG có thể khiến một số pixel trong suốt xuất hiện không trong suốt (giả sử alpha = 1 hoặc 2 thay vì alpha = 0)


-1, đây chỉ là một phiên bản lãng phí hơn đáng kể của phương pháp jpaver.

1
Phụ thuộc vào các chi tiết. Chúng tôi thường sử dụng lại các hình ảnh nút làm mặt nạ để phương thức này kết thúc bằng cách sử dụng ít bộ nhớ hơn phương pháp của jpaver.
ggambett
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.