extends Control # ============================================================================ # SettingsPanelIcon.gd - 设置面板细线图标 # ============================================================================ # 用代码绘制设置面板内的小图标,保持和右上角 HUD 一致的轻线条风格。 # ============================================================================ const BASE_SIZE: float = 32.0 const INACTIVE_COLOR: Color = Color(0.356, 0.525, 0.690, 0.86) const ACTIVE_COLOR: Color = Color(0.259, 0.627, 0.914, 1.0) const MUTED_COLOR: Color = Color(0.650, 0.745, 0.827, 0.72) const LINE_WIDTH: float = 1.25 const DETAIL_WIDTH: float = 1.05 @export var iconName: String = "basic" @export var active: bool = false var _iconScale: float = 1.0 var _iconOffset: Vector2 = Vector2.ZERO func _ready() -> void: custom_minimum_size = Vector2(32, 32) mouse_filter = Control.MOUSE_FILTER_IGNORE func set_active(value: bool) -> void: active = 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: "basic": _draw_basic() "audio": _draw_audio() "chat": _draw_chat() "controls": _draw_controls() "account": _draw_account() "volume": _draw_volume() "music": _draw_music() "effects": _draw_effects() "window": _draw_window() "eye": _draw_eye() "keyboard": _draw_keyboard() "whale": _draw_whale() _: _draw_basic() func _draw_basic() -> void: _draw_polyline([ Vector2(7.0, 17.0), Vector2(16.0, 8.6), Vector2(25.0, 17.0) ]) _draw_round_rect(Rect2(9.6, 16.3, 12.8, 9.0), 1.8) _draw_line(Vector2(16.0, 20.4), Vector2(16.0, 25.0), DETAIL_WIDTH) func _draw_audio() -> void: _draw_music() _draw_line(Vector2(21.0, 8.0), Vector2(24.4, 11.4), DETAIL_WIDTH) _draw_line(Vector2(24.4, 11.4), Vector2(21.0, 14.8), DETAIL_WIDTH) func _draw_chat() -> void: _draw_round_rect(Rect2(6.5, 8.5, 19.0, 14.0), 4.0) _draw_polyline([ Vector2(12.0, 22.0), Vector2(10.0, 26.0), Vector2(16.0, 22.5) ], DETAIL_WIDTH) _draw_line(Vector2(11.0, 14.2), Vector2(21.0, 14.2), DETAIL_WIDTH) _draw_line(Vector2(11.0, 18.0), Vector2(18.4, 18.0), DETAIL_WIDTH) func _draw_controls() -> void: _draw_round_rect(Rect2(5.7, 12.0, 20.6, 10.8), 4.8) _draw_line(Vector2(10.5, 15.2), Vector2(10.5, 19.4), DETAIL_WIDTH) _draw_line(Vector2(8.4, 17.3), Vector2(12.6, 17.3), DETAIL_WIDTH) draw_circle(_p(Vector2(19.6, 16.0)), 1.15 * _iconScale, _color()) draw_circle(_p(Vector2(22.0, 19.0)), 1.15 * _iconScale, _color()) func _draw_account() -> void: _draw_arc(Vector2(16.0, 12.0), 4.4, 0.0, TAU, 32, LINE_WIDTH) _draw_arc_poly(Vector2(16.0, 28.5), 10.2, PI + 0.20, TAU - 0.20, 28) func _draw_volume() -> void: _draw_polyline([ Vector2(6.5, 14.0), Vector2(11.0, 14.0), Vector2(17.2, 9.0), Vector2(17.2, 23.0), Vector2(11.0, 18.0), Vector2(6.5, 18.0), Vector2(6.5, 14.0) ]) _draw_arc(Vector2(18.0, 16.0), 5.6, -0.62, 0.62, 14, DETAIL_WIDTH) _draw_arc(Vector2(18.0, 16.0), 8.8, -0.56, 0.56, 16, DETAIL_WIDTH) func _draw_music() -> void: _draw_line(Vector2(12.0, 9.0), Vector2(12.0, 22.0), LINE_WIDTH) _draw_line(Vector2(22.0, 7.0), Vector2(22.0, 20.2), LINE_WIDTH) _draw_line(Vector2(12.0, 9.0), Vector2(22.0, 7.0), LINE_WIDTH) _draw_line(Vector2(12.0, 12.5), Vector2(22.0, 10.5), DETAIL_WIDTH) _draw_arc(Vector2(9.6, 23.0), 3.0, 0.0, TAU, 24, LINE_WIDTH) _draw_arc(Vector2(19.6, 21.0), 3.0, 0.0, TAU, 24, LINE_WIDTH) func _draw_effects() -> void: _draw_polyline([ Vector2(16.0, 6.5), Vector2(18.4, 13.2), Vector2(25.5, 13.4), Vector2(19.8, 17.7), Vector2(21.8, 24.6), Vector2(16.0, 20.4), Vector2(10.2, 24.6), Vector2(12.2, 17.7), Vector2(6.5, 13.4), Vector2(13.6, 13.2), Vector2(16.0, 6.5) ]) func _draw_window() -> void: _draw_round_rect(Rect2(6.0, 8.0, 20.0, 16.0), 2.3) _draw_line(Vector2(6.6, 12.2), Vector2(25.4, 12.2), DETAIL_WIDTH) _draw_line(Vector2(10.0, 16.2), Vector2(16.0, 16.2), DETAIL_WIDTH) _draw_line(Vector2(10.0, 19.6), Vector2(20.8, 19.6), DETAIL_WIDTH) func _draw_eye() -> void: _draw_arc_poly(Vector2(16.0, 17.0), 10.2, PI + 0.34, TAU - 0.34, 28) _draw_arc_poly(Vector2(16.0, 10.8), 10.2, 0.34, PI - 0.34, 28) _draw_arc(Vector2(16.0, 14.0), 2.8, 0.0, TAU, 24, DETAIL_WIDTH) func _draw_keyboard() -> void: _draw_round_rect(Rect2(5.5, 9.0, 21.0, 14.0), 2.5) for y in [13.0, 17.0]: _draw_line(Vector2(9.0, y), Vector2(23.0, y), DETAIL_WIDTH) _draw_line(Vector2(11.0, 20.3), Vector2(21.0, 20.3), DETAIL_WIDTH) func _draw_whale() -> void: var bodyColor := Color(0.424, 0.713, 0.918, 1.0) var finColor := Color(0.306, 0.612, 0.847, 1.0) var white := Color(1.0, 1.0, 1.0, 0.95) draw_arc(_p(Vector2(16.0, 18.0)), 9.0 * _iconScale, PI * 0.04, PI * 1.08, 40, bodyColor, 5.5 * _iconScale, true) draw_circle(_p(Vector2(16.0, 18.0)), 6.8 * _iconScale, bodyColor) draw_circle(_p(Vector2(18.2, 15.4)), 0.9 * _iconScale, Color(0.160, 0.286, 0.420, 0.9)) _draw_line_colored(Vector2(8.3, 18.2), Vector2(4.5, 14.8), finColor, 1.8) _draw_line_colored(Vector2(8.4, 18.4), Vector2(4.6, 21.4), finColor, 1.8) _draw_arc_colored(Vector2(15.0, 8.4), 4.0, PI * 1.05, PI * 1.80, 14, finColor, 1.5) _draw_arc_colored(Vector2(18.0, 8.4), 4.0, PI * 1.20, PI * 1.95, 14, finColor, 1.5) draw_circle(_p(Vector2(20.8, 22.0)), 1.1 * _iconScale, white) draw_circle(_p(Vector2(12.7, 22.2)), 1.0 * _iconScale, white) 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, _color(), width * _iconScale, 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, _color(), width * _iconScale, true) func _draw_line(from: Vector2, to: Vector2, width: float) -> void: draw_line(_p(from), _p(to), _color(), width * _iconScale, true) func _draw_line_colored(from: Vector2, to: Vector2, color: Color, width: float) -> void: draw_line(_p(from), _p(to), color, width * _iconScale, 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, _color(), width * _iconScale, true) func _draw_arc_colored(center: Vector2, radius: float, startAngle: float, endAngle: float, pointCount: int, color: Color, width: float) -> void: draw_arc(_p(center), radius * _iconScale, startAngle, endAngle, pointCount, color, width * _iconScale, true) func _p(point: Vector2) -> Vector2: return _iconOffset + point * _iconScale func _color() -> Color: return ACTIVE_COLOR if active else INACTIVE_COLOR