일반 바둑판과 동일한 논리를 사용하는 간단한 대안 방법을 찾았습니다. 모든 타일의 중심과 모든 정점에서 점으로 격자에 스냅 효과를 만듭니다 (더 단단한 격자를 만들고 교대로 점을 무시 함).
이 접근 방식은 플레이어가 타일 및 정점과 상호 작용하는 Catan과 같은 게임에는 효과적이지만 플레이어가 타일과 상호 작용하는 게임에는 적합하지 않습니다. 육각형 타일이 아닌 좌표에 가장 가까운 중심점 또는 정점을 반환하기 때문입니다. 좌표가 있습니다.
기하학
타일 너비의 4 분의 1 열과 타일 높이의 절반 인 행이있는 그리드에 점을 배치하면 다음 패턴이 나타납니다.
그런 다음 바둑판 패턴 (skip if column % 2 + row % 2 == 1
)의 두 번째 점을 건너 뛰도록 코드를 수정하면 다음 패턴으로 끝납니다.
이행
이 지오메트리를 염두에두고, 정사각형 그리드와 마찬가지로 2D 배열을 만들어 그리드의 x, y
각 점에 대한 좌표 (첫 번째 다이어그램에서)를 다음과 같이 저장할 수 있습니다 .
points = []
for x in numberOfColumns
points.push([])
for y in numberOfRows
points[x].push({x: x * widthOfColumn, y: y * heightOfRow})
참고 : 일반적으로 점 자체에 점 을 배치하지 않고 점 주위 에 격자를 만들 때 원점을 오프셋해야합니다 (열 너비의 절반을에서 행 높이의 절반을 뺀 값 ).x
y
이제 2D 배열 ( points
)을 초기화 했으므로 정사각형 그리드에서와 같이 마우스에서 가장 가까운 점을 찾을 수 있습니다. 두 번째 다이어그램에서 패턴을 생성하기 위해 다른 모든 점만 무시하면됩니다.
column, row = floor(mouse.x / columnWidth), floor(mouse.y / rowHeight)
point = null if column % 2 + row % 2 != 1 else points[column][row]
작동하지만 좌표가 포인터가 보이지 않는 사각형을 기준으로 가장 가까운 점 (또는 점 없음)으로 반올림됩니다. 점 주위에 원형 영역이 필요합니다 (따라서 스냅 범위는 모든 방향에서 동일합니다). 이제 어느 지점을 점검해야하는지 알았으므로 피타고라스 정리를 사용하여 거리를 쉽게 찾을 수 있습니다. 묵시적인 원은 여전히 원래 경계 사각형 안에 들어가야하며 최대 직경을 열 너비 (타일 너비의 1/4)로 제한해야하지만 실제로는 잘 작동하기에 충분히 큽니다.