54 lines
1.7 KiB
GDScript
54 lines
1.7 KiB
GDScript
class_name HudOverlay
|
|
extends Control
|
|
|
|
## Zeichnet Lebens- und Manabalken, Rolle und Sterne über die 3D-Einheiten.
|
|
|
|
var board: BoardView3D = null
|
|
var _font: Font
|
|
|
|
|
|
func _ready() -> void:
|
|
_font = ThemeDB.fallback_font
|
|
mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
set_process(true)
|
|
|
|
|
|
func _process(_delta: float) -> void:
|
|
queue_redraw()
|
|
|
|
|
|
func _draw() -> void:
|
|
if board == null or board.camera == null:
|
|
return
|
|
var cam := board.camera
|
|
for d in board.draw_units:
|
|
var world: Vector3 = d["pos"]
|
|
if cam.is_position_behind(world):
|
|
continue
|
|
var head := cam.unproject_position(world + Vector3(0.0, 1.35, 0.0))
|
|
var foot := cam.unproject_position(world + Vector3(0.0, 0.05, 0.0))
|
|
var a: Avatar = d["avatar"]
|
|
var side: int = d["side"]
|
|
|
|
# Balkenbreite nach Entfernung, damit nahe Einheiten größer wirken.
|
|
var bw: float = clampf(absf(foot.y - head.y) * 0.85, 26.0, 70.0)
|
|
var bx := head.x - bw * 0.5
|
|
var by := head.y - 4.0
|
|
draw_rect(Rect2(bx - 1.0, by - 1.0, bw + 2.0, 8.0), Color(0.05, 0.05, 0.07, 0.85))
|
|
draw_rect(Rect2(bx, by, bw * clampf(d["hp"], 0.0, 1.0), 6.0),
|
|
Color(0.35, 0.85, 0.42) if side == 0 else Color(0.92, 0.38, 0.38))
|
|
if d["mana"] > 0.0:
|
|
draw_rect(Rect2(bx, by + 7.0, bw, 4.0), Color(0.05, 0.05, 0.07, 0.85))
|
|
draw_rect(Rect2(bx, by + 7.0, bw * clampf(d["mana"], 0.0, 1.0), 4.0),
|
|
Color(0.35, 0.62, 0.95))
|
|
|
|
# Sterne
|
|
for s in a.star:
|
|
draw_circle(Vector2(bx + bw * 0.5 - 7.0 + 7.0 * float(s), by - 7.0), 2.6,
|
|
Color(1.0, 0.85, 0.25))
|
|
# Rolle
|
|
draw_string(_font, Vector2(bx + bw + 4.0, by + 7.0), Data.ROLE_SHORT[a.role],
|
|
HORIZONTAL_ALIGNMENT_LEFT, -1, 13, Color(0.9, 0.9, 0.95, 0.9))
|
|
if d["cast"]:
|
|
draw_arc(foot, bw * 0.55, 0.0, TAU, 24, Color(1.0, 0.95, 0.5, 0.9), 2.5)
|