forked from xiangwang25/whale-town-front-v2
Initial WhaleTown V2 frontend
This commit is contained in:
143
scenes/ui/HudShortcutIcon.gd
Normal file
143
scenes/ui/HudShortcutIcon.gd
Normal file
@@ -0,0 +1,143 @@
|
||||
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()
|
||||
_:
|
||||
_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_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
|
||||
Reference in New Issue
Block a user