first commit
This commit is contained in:
53
scripts/ui/HudOverlay.gd
Normal file
53
scripts/ui/HudOverlay.gd
Normal file
@@ -0,0 +1,53 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user