通常のチェッカーボードと同じロジックを使用するシンプルな代替アプローチを見つけました。これは、すべてのタイルの中心とすべての頂点にポイントを持つグリッドへのスナップ効果を作成します(より狭いグリッドを作成し、交替するポイントを無視することにより)。
このアプローチは、プレーヤーがタイルと頂点を操作するCatanのようなゲームに適していますが、六角形タイルではなく、座標に最も近い中心点または頂点を返すため、プレイヤーがタイルのみを操作するゲームには適していません。座標は以内です。
ジオメトリ
タイルの幅の4分の1の列とタイルの高さの半分の行を持つグリッドにポイントを配置すると、次のパターンが得られます。
次に、チェッカーボードパターン(スキップif column % 2 + row % 2 == 1
)で2番目のドットをスキップするようにコードを変更すると、次のパターンになります。
実装
そのジオメトリを念頭に置いて、2次元配列を作成し(正方グリッドの場合と同じように)、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
)が初期化されたので、正方格子の場合と同じように、マウスに最も近い点を見つけることができます。2番目の図のパターンを生成するために他のすべての点を無視する必要があります。
column, row = floor(mouse.x / columnWidth), floor(mouse.y / rowHeight)
point = null if column % 2 + row % 2 != 1 else points[column][row]
これは機能しますが、座標は、ポインターが含まれている非表示の四角形に基づいて、最も近い点(または点なし)に丸められます。あなたは本当にその点の周りに円形のゾーンが必要です(そのため、スナップ範囲はすべての方向で等しくなります)。チェックするポイントがわかったので、距離を簡単に見つけることができます(ピタゴラスの定理を使用)。暗黙の円は、元の境界の四角形の内側に収まる必要があり、その最大直径は列の幅(タイルの幅の4分の1)に制限されますが、実際には十分に機能します。