You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.6 KiB
87 lines
2.6 KiB
# TODO: Make this work again. |
|
class_name Health |
|
extends Node2D |
|
|
|
const TIME_VISIBLE := 1.0 |
|
const TIME_FADE := 1.5 |
|
|
|
@export var player : Player |
|
|
|
@export var segments := 6 |
|
@export var inner_radius := 14 |
|
@export var outer_radius := 24 |
|
@export var separation := 2.0 |
|
|
|
@onready var start_angle := (TAU / 4) - (TAU / segments / 2) |
|
|
|
var health : float |
|
var visibility_timer : float |
|
|
|
|
|
func _ready() -> void: |
|
visible = false |
|
|
|
|
|
func _process(delta: float) -> void: |
|
if not player: |
|
visible = false |
|
return |
|
|
|
if player.health.current >= 1.0: |
|
if !visible: return |
|
if visibility_timer > TIME_VISIBLE + TIME_FADE: |
|
visible = false |
|
return |
|
if visibility_timer > TIME_VISIBLE: |
|
modulate = Color(Color.WHITE, 1.0 - (visibility_timer - TIME_VISIBLE) / TIME_FADE) |
|
visibility_timer += delta |
|
|
|
else: |
|
visible = true |
|
modulate = Color.WHITE |
|
visibility_timer = 0.0 |
|
|
|
position = player.get_global_transform_with_canvas().origin; |
|
health = player.health.current; |
|
|
|
|
|
func _draw() -> void: |
|
for i in segments: |
|
var angle_1 := start_angle + TAU * ( i / float(segments)) |
|
var angle_3 := start_angle + TAU * ((i + 1) / float(segments)) |
|
var angle_2 := (angle_1 + angle_3) / 2 |
|
|
|
var sep_1 := separation * Vector2.from_angle(angle_1 + TAU / 4) |
|
var sep_2 := separation * Vector2.from_angle(angle_3 - TAU / 4) |
|
|
|
draw_colored_polygon([ |
|
inner_radius * Vector2.from_angle(angle_2) , |
|
inner_radius * Vector2.from_angle(angle_1) + sep_1, |
|
outer_radius * Vector2.from_angle(angle_1) + sep_1, |
|
outer_radius * Vector2.from_angle(angle_2) , |
|
outer_radius * Vector2.from_angle(angle_3) + sep_2, |
|
inner_radius * Vector2.from_angle(angle_3) + sep_2, |
|
], Color(Color.BLACK, 0.4)) # antialiased = true |
|
|
|
for i in segments: |
|
var fullness := clampf((health * segments) - i, 0.0, 1.0) |
|
if fullness <= 0.1: return |
|
|
|
var angle_1 := start_angle + TAU * ( i / float(segments)) |
|
var angle_3 := start_angle + TAU * ((i + 1) / float(segments)) |
|
var angle_2 := (angle_1 + angle_3) / 2 |
|
|
|
var sep_1 := separation * Vector2.from_angle(angle_1 + TAU / 4) |
|
var sep_2 := separation * Vector2.from_angle(angle_3 - TAU / 4) |
|
|
|
var _inner_radius_2 = inner_radius + 1 |
|
var _outer_radius_2 = lerpf(inner_radius, outer_radius, fullness) - 1 |
|
|
|
draw_colored_polygon([ |
|
inner_radius * Vector2.from_angle(angle_2) , |
|
inner_radius * Vector2.from_angle(angle_1) + sep_1, |
|
outer_radius * Vector2.from_angle(angle_1) + sep_1, |
|
outer_radius * Vector2.from_angle(angle_2) , |
|
outer_radius * Vector2.from_angle(angle_3) + sep_2, |
|
inner_radius * Vector2.from_angle(angle_3) + sep_2, |
|
], Color(Color.RED, 0.5)) # antialiased = true
|
|
|