class_name TriggerArea extends Node2D ## TriggerArea - Placeable rectangular sensor for the Sandbox Stage (Phase 4). ## ## A drawn Node2D (NOT a physics Area2D) that the stage's geometric event engine ## polls for movable overlap. Purely visual plus a size query; no signals, no ## physics. Draws a translucent green fill with a dashed green border so it reads ## as a trigger zone in EDIT mode. World-space child, so no zoom division is ## needed for the dashed border. ## Half-extents of the rectangular sensor in local space. @export var size: Vector2 = Vector2(96.0, 96.0): set(value): size = value queue_redraw() ## Local-space rectangle (centered on the node origin) used for overlap tests. func get_area_rect() -> Rect2: return Rect2(-size * 0.5, size) func _draw() -> void: var rect := get_area_rect() draw_rect(rect, Color(0.2, 0.8, 0.3, 0.12), true) _draw_dashed_rect(rect, Color(0.2, 0.8, 0.3, 0.6), 2.0, 6.0, 4.0) ## Dashed border along each edge of `rect` (top/right/bottom/left), drawn with a ## small manual dash loop using draw_line. func _draw_dashed_rect(rect: Rect2, color: Color, width: float, dash: float, gap: float) -> void: var tl := rect.position var tr := rect.position + Vector2(rect.size.x, 0.0) var br := rect.position + rect.size var bl := rect.position + Vector2(0.0, rect.size.y) _draw_dashed_edge(tl, tr, color, width, dash, gap) _draw_dashed_edge(tr, br, color, width, dash, gap) _draw_dashed_edge(br, bl, color, width, dash, gap) _draw_dashed_edge(bl, tl, color, width, dash, gap) func _draw_dashed_edge(from: Vector2, to: Vector2, color: Color, width: float, dash: float, gap: float) -> void: var dir := from.direction_to(to) var total := from.distance_to(to) var dist := 0.0 while dist < total: var start := from + dir * dist var len := minf(dash, total - dist) draw_line(start, start + dir * len, color, width, true) dist += dash + gap