52 lines
1.4 KiB
GDScript
52 lines
1.4 KiB
GDScript
class_name Hex
|
|
extends RefCounted
|
|
|
|
## Hex-Helfer für "odd-r" Offset-Koordinaten (spitze Hexes, ungerade Zeilen versetzt).
|
|
|
|
const NEIGHBORS_EVEN := [
|
|
Vector2i(1, 0), Vector2i(0, -1), Vector2i(-1, -1),
|
|
Vector2i(-1, 0), Vector2i(-1, 1), Vector2i(0, 1),
|
|
]
|
|
const NEIGHBORS_ODD := [
|
|
Vector2i(1, 0), Vector2i(1, -1), Vector2i(0, -1),
|
|
Vector2i(-1, 0), Vector2i(0, 1), Vector2i(1, 1),
|
|
]
|
|
|
|
|
|
static func to_cube(p: Vector2i) -> Vector3i:
|
|
var x := p.x - int((p.y - (p.y & 1)) / 2.0)
|
|
var z := p.y
|
|
return Vector3i(x, -x - z, z)
|
|
|
|
|
|
static func distance(a: Vector2i, b: Vector2i) -> int:
|
|
var ca := to_cube(a)
|
|
var cb := to_cube(b)
|
|
return int((absi(ca.x - cb.x) + absi(ca.y - cb.y) + absi(ca.z - cb.z)) / 2.0)
|
|
|
|
|
|
static func neighbors(p: Vector2i) -> Array:
|
|
var offs: Array = NEIGHBORS_ODD if (p.y & 1) == 1 else NEIGHBORS_EVEN
|
|
var out := []
|
|
for o in offs:
|
|
out.append(p + o)
|
|
return out
|
|
|
|
|
|
## Pixelmittelpunkt eines Hex-Feldes.
|
|
static func to_pixel(p: Vector2i, size: float) -> Vector2:
|
|
var w := sqrt(3.0) * size
|
|
var h := 1.5 * size
|
|
var x := w * (float(p.x) + 0.5 * float(p.y & 1))
|
|
var y := h * float(p.y)
|
|
return Vector2(x, y)
|
|
|
|
|
|
## Eckpunkte eines spitzen Hex um (0,0).
|
|
static func corners(size: float) -> PackedVector2Array:
|
|
var pts := PackedVector2Array()
|
|
for i in 6:
|
|
var ang := deg_to_rad(60.0 * float(i) - 30.0)
|
|
pts.append(Vector2(size * cos(ang), size * sin(ang)))
|
|
return pts
|