forked from xiangwang25/whale-town-front-v2
209 lines
7.7 KiB
GDScript
209 lines
7.7 KiB
GDScript
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
|