2D multiplayer platformer using Godot Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

45 lines
1.2 KiB

class_name BlockRegion
extends RefCounted
static var LOCAL_CHUNK := BlockRegion.new(Vector2i.ZERO, Vector2i.ONE * (Chunk.SIZE - 1))
var min: Vector2i
var max: Vector2i
func _init(a: Vector2i, b: Vector2i) -> void:
min = a.min(b)
max = a.max(b)
func size() -> Vector2i:
return max - min + Vector2i.ONE
func contains(pos: Vector2i) -> bool:
return (pos.x >= min.x) && (pos.x <= max.x) and (pos.y >= min.y) && (pos.y <= max.y)
func offset(value: Vector2i) -> BlockRegion:
return BlockRegion.new(min + value, max + value)
func extend(amount: int) -> BlockRegion:
var v := Vector2i.ONE * amount
return BlockRegion.new(min - v, max + v)
func array_index(pos: Vector2i) -> int:
assert(contains(pos))
var size := size()
var index := (pos.x - min.x) + (pos.y - min.y) * size.x
return clampi(index, 0, size.x * size.y)
# Custom iterators in GDScript are WEIRD.
func _iter_init(state: Array) -> bool:
state[0] = min
return true
func _iter_next(state: Array) -> bool:
var cur: Vector2i = state[0]
if cur.x < max.x: state[0].x += 1; return true
elif cur.y < max.y: state[0] = Vector2i(min.x, cur.y + 1); return true
else: return false
func _iter_get(state: Variant) -> Vector2i:
return state