Files
elements-autochess/scripts/core/Hex.gd
2026-08-29 11:42:54 +02:00

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