Tôi đang tạo một trò chơi 2D trong Java bằng cách sử dụng thư viện Java2D để vẽ và tôi thực sự cần một đối tượng Đa giác chính xác mà tôi có thể sử dụng để vẽ các đối tượng trò chơi và phát hiện va chạm trên chúng . Thật không may, đối tượng Polygon của Java chỉ có độ chính xác int, và không có Polygon2D tương đương như với Rectangle và Rectangle2D. Tôi đã làm đủ nghiên cứu để thấy rằng tôi có một vài lựa chọn, nhưng không ai trong số họ có vẻ rất tốt.Thực hiện Polygon2D trong Java 2D
Sử dụng Path2D. Theo một nhà phát triển Java đăng trong this forum, việc thiếu Polygon2D là một sự giám sát, nhưng thay thế được đề xuất của nó là Path2D. Thật không may, Path2D không cung cấp một cách để truy cập các đỉnh hoặc cạnh riêng lẻ của nó, mà tôi cần để phát hiện xung đột (đặc biệt là tôi cần phải có một trực giao vectơ cho mỗi cạnh).
Triển khai Polygon2D của riêng mình triển khai giao diện Hình dạng để tôi vẫn có thể chuyển giao cho
Graphics2D.draw(Shape)
. Điều này có vẻ như nó sẽ khá khó khăn. Giao diện Hình dạng yêu cầu các phương pháp khó thực hiện nhưcontains(Rectangle2D)
vàgetPathIterator(AffineTransform)
. Đối vớigetPathIterator
nói riêng, có vẻ như để thực hiện nó, tôi cần trả về một đối tượng kiểu PathIterator, nhưng không có sự triển khai cụ thể nào của giao diện PathIterator có sẵn trong các gói AWT công khai.Wrap Path2D trong một đối tượng "ghi nhớ" các đỉnh riêng lẻ và cung cấp chúng cho khách hàng. Điều này làm việc cho tôi khi tôi cần một Vùng nhớ hình dạng thành phần của nó: Tôi bọc nó trong một lớp CompoundShape đã triển khai giao diện Shape và chuyển tiếp tất cả các phương thức Shape tới việc thực hiện Area của chúng, trong khi vẫn theo dõi từng Shape đã được thêm vào Khu vực trong một ArrayList. Vấn đề với điều này là nếu tôi theo dõi các đỉnh riêng lẻ trong hai mảng
float
s, không có cách nào để hiển thị chúng cho người dùng mà không có khả năng người dùng thay đổi các đỉnh - và vì điều đó sẽ xảy ra khi truy cập mảng trực tiếp , Path2D nội bộ sẽ không được thông báo về các thay đổi.Sao chép Polygon.java. Mã nguồn thực tế của lớp Polygon của Java có sẵn trên grepcode.com và tôi có thể chỉ cần thay thế các liên quan đến đỉnh
int
s bằng sốfloat
trong suốt để lấy một Polygon2D. Thật không may, khi tôi đã thử điều này, dòngimport sun.awt.geom.Crossings;
đã ném một lỗi trình biên dịch nói rằng "Các loại Crossings không thể truy cập do hạn chế trên thư viện cần thiết C: \ Program Files \ Java \ jre7 \ lib \ rt.jar." Theo this question điều đó xảy ra vì thỏa thuận cấp phép của Sun ngăn bạn thay thế các lớp Java lõi bằng chính bạn, nhưng Đa giác không cố gắng làm điều đó - nó đơn giản tạo ra một đối tượng kiểu sun.awt.geom.Crossings, không thay thế hoặc mở rộng xảy ra và tôi chắc chắn đã đặt bản sao Đa giác của mình trong một gói không được gọi là "java".
Cách tốt nhất để tiếp tục điều này là gì? Tôi muốn đánh giá cao một trong hai đề xuất về cách làm cho một trong các tùy chọn này hoạt động hoặc ý tưởng cho một tùy chọn khác không có vấn đề trong cuộc gặp gỡ này.
Tìm kiếm [java Polygon2D] (https://www.google.com/search?q=java+polygon2d&ie=utf-8&oe=utf-8&client=ubuntu&channel=fs) trên google đã cho tôi [trang web này] (http : //www.koders.com/java/fid058B5904198EB5BA18B9B086CC3B953F96CD2750.aspx) là một 'Polygon2D' sử dụng độ chính xác kép. – dacwe
Có vẻ như mã Polygon2D cũng sử dụng sun.awt.geom.Crossings, vì vậy nó sẽ có cùng một vấn đề như nỗ lực của tôi để sao chép 'Đa giác' và thay đổi nó để sử dụng' float '. – Edward