first commit
This commit is contained in:
51
scripts/core/Hex.gd
Normal file
51
scripts/core/Hex.gd
Normal file
@@ -0,0 +1,51 @@
|
||||
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
|
||||
Reference in New Issue
Block a user