extends Control # ============================================================================ # HudShortcutIcon.gd - 顶部快捷入口轻量线描图标 # ============================================================================ # 专门按 25px HUD 小尺寸绘制,保持细线、少细节、轻视觉重量。 # ============================================================================ const LINE_COLOR: Color = Color(0.592157, 0.72549, 0.835294, 0.82) const DOT_COLOR: Color = Color(0.941176, 0.54902, 0.54902, 0.86) const DOT_BORDER_COLOR: Color = Color(1.0, 1.0, 1.0, 0.95) const LINE_WIDTH: float = 0.85 const DETAIL_WIDTH: float = 0.75 const BASE_SIZE: float = 27.0 var iconName: String = "map" var _iconScale: float = 1.0 var _iconOffset: Vector2 = Vector2.ZERO func _ready() -> void: custom_minimum_size = Vector2(31, 31) mouse_filter = Control.MOUSE_FILTER_IGNORE func set_icon_name(value: String) -> void: iconName = value queue_redraw() func _draw() -> void: _iconScale = min(size.x, size.y) / BASE_SIZE _iconOffset = (size - Vector2(BASE_SIZE, BASE_SIZE) * _iconScale) * 0.5 match iconName: "map": _draw_map() "task": _draw_task() "activity": _draw_activity() "backpack": _draw_backpack() "friends": _draw_friends() "settings": _draw_settings() "admin": _draw_admin() _: _draw_map() func _draw_map() -> void: _draw_polyline([ Vector2(6.0, 7.0), Vector2(10.9, 5.4), Vector2(16.2, 7.1), Vector2(21.0, 5.5), Vector2(21.0, 20.1), Vector2(16.2, 21.6), Vector2(10.9, 19.9), Vector2(6.0, 21.5), Vector2(6.0, 7.0), ]) _draw_line(Vector2(10.9, 6.0), Vector2(10.9, 19.2), DETAIL_WIDTH) _draw_line(Vector2(16.2, 7.7), Vector2(16.2, 21.0), DETAIL_WIDTH) func _draw_task() -> void: _draw_round_rect(Rect2(7.3, 6.2, 12.4, 15.4), 2.2) _draw_line(Vector2(11.0, 5.0), Vector2(16.0, 5.0), LINE_WIDTH) _draw_line(Vector2(9.8, 11.0), Vector2(16.8, 11.0), DETAIL_WIDTH) _draw_line(Vector2(9.8, 14.8), Vector2(16.8, 14.8), DETAIL_WIDTH) _draw_line(Vector2(9.8, 18.6), Vector2(14.8, 18.6), DETAIL_WIDTH) _draw_red_dot(Vector2(20.0, 5.6)) func _draw_activity() -> void: _draw_round_rect(Rect2(6.2, 7.5, 14.1, 13.2), 2.2) _draw_line(Vector2(6.9, 11.5), Vector2(19.5, 11.5), DETAIL_WIDTH) _draw_line(Vector2(9.6, 5.5), Vector2(9.6, 9.0), DETAIL_WIDTH) _draw_line(Vector2(16.7, 5.5), Vector2(16.7, 9.0), DETAIL_WIDTH) _draw_line(Vector2(10.0, 15.6), Vector2(12.0, 15.6), DETAIL_WIDTH) _draw_line(Vector2(14.6, 15.6), Vector2(16.6, 15.6), DETAIL_WIDTH) _draw_red_dot(Vector2(20.4, 5.8)) func _draw_backpack() -> void: _draw_round_rect(Rect2(6.4, 8.4, 14.2, 12.6), 2.4) _draw_arc_poly(Vector2(13.5, 9.0), 4.0, PI + 0.18, TAU - 0.18, 18, DETAIL_WIDTH) _draw_line(Vector2(8.9, 12.4), Vector2(18.1, 12.4), DETAIL_WIDTH) _draw_round_rect(Rect2(10.4, 13.9, 6.2, 4.4), 1.2, DETAIL_WIDTH) _draw_line(Vector2(8.2, 10.2), Vector2(8.2, 20.0), DETAIL_WIDTH) _draw_line(Vector2(18.8, 10.2), Vector2(18.8, 20.0), DETAIL_WIDTH) func _draw_friends() -> void: _draw_arc(Vector2(10.2, 9.4), 3.1, 0.0, TAU, 28, LINE_WIDTH) _draw_arc_poly(Vector2(10.2, 21.6), 6.1, PI + 0.10, TAU - 0.10, 22) _draw_arc(Vector2(17.8, 10.6), 2.5, 0.0, TAU, 24, DETAIL_WIDTH) _draw_arc_poly(Vector2(17.8, 21.6), 4.7, PI + 0.16, TAU - 0.24, 18, DETAIL_WIDTH) func _draw_settings() -> void: var center := Vector2(13.5, 13.5) for i in range(8): var angle := TAU * float(i) / 8.0 var inner := center + Vector2(cos(angle), sin(angle)) * 5.0 var outer := center + Vector2(cos(angle), sin(angle)) * 6.7 _draw_line(inner, outer, DETAIL_WIDTH) _draw_arc(center, 4.9, 0.0, TAU, 32, LINE_WIDTH) _draw_arc(center, 2.0, 0.0, TAU, 24, DETAIL_WIDTH) func _draw_admin() -> void: _draw_round_rect(Rect2(7.0, 5.8, 13.0, 15.6), 3.0) _draw_line(Vector2(9.5, 11.0), Vector2(17.5, 11.0), DETAIL_WIDTH) _draw_line(Vector2(9.5, 14.5), Vector2(15.3, 14.5), DETAIL_WIDTH) _draw_arc(Vector2(13.5, 20.5), 3.5, PI, TAU, 16, DETAIL_WIDTH) _draw_red_dot(Vector2(20.2, 6.0)) func _draw_round_rect(rect: Rect2, radius: float, width: float = LINE_WIDTH) -> void: var left := rect.position.x var top := rect.position.y var right := rect.end.x var bottom := rect.end.y _draw_line(Vector2(left + radius, top), Vector2(right - radius, top), width) _draw_line(Vector2(right, top + radius), Vector2(right, bottom - radius), width) _draw_line(Vector2(right - radius, bottom), Vector2(left + radius, bottom), width) _draw_line(Vector2(left, bottom - radius), Vector2(left, top + radius), width) _draw_arc(Vector2(left + radius, top + radius), radius, PI, PI * 1.5, 8, width) _draw_arc(Vector2(right - radius, top + radius), radius, PI * 1.5, TAU, 8, width) _draw_arc(Vector2(right - radius, bottom - radius), radius, 0.0, PI * 0.5, 8, width) _draw_arc(Vector2(left + radius, bottom - radius), radius, PI * 0.5, PI, 8, width) func _draw_arc_poly(center: Vector2, radius: float, start: float, end: float, pointCount: int, width: float = LINE_WIDTH) -> void: var points: PackedVector2Array = [] for i in range(pointCount + 1): var t := float(i) / float(pointCount) var angle := lerpf(start, end, t) points.append(_p(center + Vector2(cos(angle), sin(angle)) * radius)) draw_polyline(points, LINE_COLOR, width, true) func _draw_polyline(points: Array[Vector2], width: float = LINE_WIDTH) -> void: var packed: PackedVector2Array = [] for point in points: packed.append(_p(point)) draw_polyline(packed, LINE_COLOR, width, true) func _draw_red_dot(center: Vector2) -> void: draw_circle(_p(center), 2.3 * _iconScale, DOT_BORDER_COLOR) draw_circle(_p(center), 1.55 * _iconScale, DOT_COLOR) func _draw_line(from: Vector2, to: Vector2, width: float) -> void: draw_line(_p(from), _p(to), LINE_COLOR, width, true) func _draw_arc(center: Vector2, radius: float, startAngle: float, endAngle: float, pointCount: int, width: float) -> void: draw_arc(_p(center), radius * _iconScale, startAngle, endAngle, pointCount, LINE_COLOR, width, true) func _p(point: Vector2) -> Vector2: return _iconOffset + point * _iconScale