Nhận biết một clickbox lục giác


17

Tôi đang làm việc trên một trò chơi sẽ liên quan đến các hình lục giác thở hổn hển .

Hiện tại, tôi có một hình lục giác mà tôi đang sử dụng (tất cả các cạnh đều có cùng độ dài ... nó phù hợp với hình ảnh 50px x 50px).

Tôi hơi mới đối với C # và thực sự mới đối với XNA, nhưng có một phương pháp dễ dàng nào đó mà tôi có thể gọi thay vì thực hiện một câu lệnh if phức tạp dựa trên các điểm và góc?


Xem gamedev.stackexchange.com/questions/6382/ trên đó thực hiện phát hiện nhấp chuột hex.
Tim Holt

4
Tôi hoàn toàn googled "hình lục giác thở hổn hển" Tôi giống như, "đó là loại hình lục giác gì?!" Đoán tôi đang có một ngày chậm.
MichaelHouse

2
Hmm, điều gì xảy ra nếu bạn nhấp vào gasp chứ không phải trong hình lục giác?
Tim Holt

1
Tùy thuộc vào nhu cầu của bạn, một vòng tròn đơn giản sẽ làm nếu nó chỉ dành cho một khu vực nhấp chuột. Nếu không, bạn sẽ phải sử dụng một điểm trên kỹ thuật đa giác như tổng cuộn hoặc tổng.
PhilCK

Trừ khi bản đồ hex được xoay tùy ý, điểm trên đa giác là MAJOR quá mức cần thiết. Bạn làm gì với bản đồ 1000x1000 hexes? Kiểm tra từng người một? RE: Vòng kết nối, chúng sẽ không hoạt động. Gần đỉnh ngã ba giữa ba hình lục giác, bạn sẽ có ba vòng tròn chồng lên nhau. Các vòng tròn nhỏ hơn nằm hoàn toàn trong các hình lục giác sẽ có những khoảng trống trong đó các nhấp chuột hợp pháp sẽ không nằm trong bất kỳ vòng tròn nào.
Tim Holt

Câu trả lời:


18

Một hình lục giác là một hình chữ nhật với các góc được cắt. Cách tôi đã thấy điều này và tôi đã nghe loạt Civilization thực hiện theo cách này với các bản đồ trực giao, là tạo ra một bitmap với một khoảng trắng (trực giao hoặc lục giác), và một màu đỏ, xanh lá cây, xanh dương và vàng góc. (Hoặc bất cứ màu nào bạn thích.)

Lục giác: Mặt nạ lục giáchoặcnhập mô tả hình ảnh ở đây

Trực giao: nhập mô tả hình ảnh ở đây

Sau đó, chỉ cần xác định hình chữ nhật nào con trỏ kết thúc và kiểm tra màu của pixel tại vị trí đó. Nếu nó màu trắng, chúng sẽ lơ lửng trên không gian đó. Mỗi màu khác được ánh xạ tới một phần bù và thay vào đó chúng sẽ di chuột qua hình lục giác đó. Cách này hiệu quả, mất ít hình học và có thể được sử dụng cho bất kỳ không gian sắp xếp tùy ý nào.


Chỉ cần một lưu ý: Một hình lục giác có 6 cạnh chiều dài bằng nhau. Không có hình ảnh nào bạn trình bày thực sự có chứa hình lục giác. Thay vào đó, chúng chứa 6 đa giác mặt. Ngoài ra, phương pháp này hoạt động. Tuy nhiên, nó có thể chậm hơn so với tính toán các giới hạn của hình lục giác, đối với các hình lục giác lớn hơn, vì phương pháp này đòi hỏi nhiều không gian hơn cho các hình lục giác lớn hơn (nếu bạn muốn giữ độ chính xác trên mỗi pixel). Đối với các hình lục giác nhỏ (và tùy thuộc vào phần cứng), phương pháp này có thể nhanh hơn so với tính toán giới hạn.
Olhovsky

9
Một hình lục giác là bất kỳ đa giác 6 mặt. Những gì bạn đang nghĩ đến là một hình lục giác đều (thực ra, có lẽ bạn đang nghĩ về một hình lục giác đều , đó là một loại hình lục giác đều tam giác đều )
Random832

Xin lưu ý rằng tôi đã không nói rằng câu trả lời của bạn là xấu. Tôi nghĩ rằng đó là một câu trả lời tốt và một giải pháp có chỗ đứng. Điều đó nói rằng, tôi sẽ không chọn phương pháp này qua việc tính toán các giới hạn lục giác, vì tính toán các giới hạn lục giác trên bất kỳ nền tảng hiện đại nào, vì tính toán các giới hạn là một cách mở rộng hơn nhiều để thực hiện. Ví dụ: giả sử bạn muốn thay đổi kích thước hình lục giác - bây giờ bạn phải xây dựng lại hình ảnh? Sản xuất một mặt nạ hình lục giác hoàn hảo pixel là một nỗi đau. Việc bạn chưa sản xuất một thứ ở đây là một minh chứng cho điều đó, tôi nghĩ vậy.
Olhovsky

2
@Olhovsky - Tôi chưa sản xuất mặt nạ hình lục giác hoàn hảo ở đây vì tôi đang trả lời các câu hỏi như một dịch vụ cộng đồng trong thời gian nghỉ vài phút khi làm việc và không thực sự viết một trò chơi video. OP đang tìm kiếm một giải pháp với ít toán học hơn và tôi nghĩ rằng nó rất gọn gàng nên tôi nghĩ tôi sẽ chia sẻ, vì đó là điều mà tôi chắc chắn sẽ không nghĩ đến.
dlras2

18

Không có phương pháp XNA nào thực hiện kiểm tra đánh lục giác.

Bài viết này giải thích cách viết một hàm thực hiện kiểm tra và cung cấp cho bạn hàm:

Cách kiểm tra nếu một điểm nằm trong hình lục giác

Dưới đây là một bản tóm tắt từ bài viết đó: hộp bấm hình lục giác

Và chức năng thực hiện bài kiểm tra như sau:

  1. Kiểm tra hộp giới hạn xung quanh hình lục giác, sớm ra nếu nó không giao nhau.
  2. Chuyển đổi điểm thành góc phần tư cục bộ như hình trên.
  3. Thực hiện các isInsidethử nghiệm sau đây cho góc phần tư cục bộ.

public function isInside(pos:Vec2Const):Boolean
{
    const q2x:Number = Math.abs(pos.x - _center.x);       
    const q2y:Number = Math.abs(pos.y - _center.y);
    if (q2x > _hori || q2y > _vert*2) 
        return false;
    return 2 * _vert * _hori - _vert * q2x - _hori * q2y >= 0;
}

Xem bài viết để biết chi tiết đầy đủ.


Dưới đây là một số nguồn hữu ích liên quan khác:


1

Ở đây tôi có một phương pháp có thể được sử dụng để phát hiện các nhấp chuột bên trong bất kỳ đa giác nào:

public bool PointInPolygon( Vector2 p, Vector2[] poly )
    {
        Vector2 p1, p2;
        bool inside = false;

        if( poly.Length < 3 )
        {
            return inside;
        }

        Vector2 oldPoint = new Vector2( poly[poly.Length - 1].X, poly[poly.Length - 1].Y );

        for( int i = 0; i < poly.Length; i++ )
        {
            Vector2 newPoint = new Vector2( poly[i].X, poly[i].Y );

            if( newPoint.X > oldPoint.X )
            {
                p1 = oldPoint;
                p2 = newPoint;
            }
            else
            {
                p1 = newPoint;
                p2 = oldPoint;
            }

            if( ( newPoint.X < p.X ) == ( p.X <= oldPoint.X )
                && ( (long)p.Y - (long)p1.Y ) * (long)( p2.X - p1.X )
                 < ( (long)p2.Y - (long)p1.Y ) * (long)( p.X - p1.X ) )
            {
                inside = !inside;
            }

            oldPoint = newPoint;
        }

        return inside;
    }

Bạn cần cung cấp các góc của hình lục giác của bạn trong một mảng vector2 (poly) và vị trí được nhấp (p) cho phương thức.

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.