Tôi tìm thấy một cách tiếp cận đơn giản, thay thế sử dụng logic tương tự như một bàn cờ thông thường. Nó tạo ra hiệu ứng snap-to-lưới với các điểm ở trung tâm của mọi ô và ở mọi đỉnh (bằng cách tạo lưới chặt hơn và bỏ qua các điểm xen kẽ).
Cách tiếp cận này hoạt động tốt cho các trò chơi như Catan, nơi người chơi tương tác với các ô và các đỉnh, nhưng không phù hợp với các trò chơi mà người chơi chỉ tương tác với các ô, vì nó trả về điểm trung tâm hoặc đỉnh tọa độ gần nhất, thay vì các ô hình lục giác tọa độ là trong.
Hình học
Nếu bạn đặt các điểm trong một lưới có các cột bằng một phần tư chiều rộng của ô và các hàng bằng một nửa chiều cao của ô, bạn sẽ có được mẫu này:
Sau đó, nếu bạn sửa đổi mã để bỏ qua mỗi dấu chấm thứ hai trong mẫu bàn cờ (bỏ qua if column % 2 + row % 2 == 1
), bạn sẽ kết thúc với mẫu này:
Thực hiện
Với ý nghĩa hình học đó, bạn có thể tạo một mảng 2D (giống như bạn làm với lưới hình vuông), lưu trữ x, y
tọa độ cho từng điểm trong lưới (từ sơ đồ đầu tiên) - đại loại như thế này:
points = []
for x in numberOfColumns
points.push([])
for y in numberOfRows
points[x].push({x: x * widthOfColumn, y: y * heightOfRow})
Lưu ý: Như bình thường, khi bạn đang tạo lưới xung quanh các điểm (thay vì đặt các dấu chấm tại các điểm), bạn cần phải bù gốc (trừ một nửa chiều rộng của cột từ x
và một nửa chiều cao của một hàng từ y
).
Bây giờ bạn đã points
khởi tạo mảng 2D ( ), bạn có thể tìm điểm gần nhất với chuột giống như trên lưới vuông, chỉ cần bỏ qua mọi điểm khác để tạo mẫu trong sơ đồ thứ hai:
column, row = floor(mouse.x / columnWidth), floor(mouse.y / rowHeight)
point = null if column % 2 + row % 2 != 1 else points[column][row]
Điều đó sẽ hoạt động, nhưng các tọa độ đang được làm tròn đến điểm gần nhất (hoặc không có điểm) dựa trên hình chữ nhật vô hình mà con trỏ nằm trong đó. Bạn thực sự muốn có một vùng tròn xung quanh điểm (vì vậy phạm vi snap là bằng nhau theo mọi hướng). Bây giờ bạn đã biết điểm nào cần kiểm tra, bạn có thể dễ dàng tìm thấy khoảng cách (sử dụng Định lý Pythagoras). Vòng tròn ngụ ý vẫn sẽ phải nằm gọn trong hình chữ nhật giới hạn ban đầu, giới hạn đường kính tối đa của nó với chiều rộng của cột (một phần tư chiều rộng của gạch), nhưng nó vẫn đủ lớn để hoạt động tốt trong thực tế.