72 lines
1.7 KiB
GDScript
72 lines
1.7 KiB
GDScript
class_name HealthBar
|
|
extends Node2D
|
|
|
|
const ANIMATION_ALERT = "alert"
|
|
|
|
const SHADER_MAX_VALUE = "shader_parameter/max_value"
|
|
const SHADER_CURRENT_VALUE = "shader_parameter/current_value"
|
|
const SHADER_OLD_VALUE = "shader_parameter/old_value"
|
|
|
|
|
|
const OLD_VALUE_DECRETION_RATE = 25.0
|
|
|
|
|
|
var _max_value := 0.0:
|
|
set(value):
|
|
_max_value = value
|
|
if is_node_ready():
|
|
health_sprite.material.set(SHADER_MAX_VALUE, _max_value)
|
|
|
|
var _current_value := 0.0:
|
|
set(value):
|
|
_current_value = value
|
|
if is_node_ready():
|
|
health_sprite.material.set(SHADER_CURRENT_VALUE, _current_value)
|
|
|
|
var _old_value := 0.0:
|
|
set(value):
|
|
_old_value = value
|
|
if is_node_ready():
|
|
health_sprite.material.set(SHADER_OLD_VALUE, _old_value)
|
|
|
|
var _old_value_tween : Tween
|
|
|
|
var _is_animation_needed := false
|
|
|
|
|
|
@onready var background_sprite : Sprite2D = $BackgroundSprite
|
|
@onready var alert_sprite : Sprite2D = $AlertSprite
|
|
@onready var health_sprite : Sprite2D = $HealthSprite
|
|
|
|
@onready var animation_player : AnimationPlayer = $AnimationPlayer
|
|
|
|
|
|
func _ready() -> void:
|
|
alert_sprite.hide()
|
|
|
|
|
|
func _process(_delta: float) -> void:
|
|
if _is_animation_needed and not animation_player.is_playing():
|
|
animation_player.play(ANIMATION_ALERT)
|
|
_is_animation_needed = false
|
|
|
|
|
|
func initialize(max_value: float, value: float) -> void:
|
|
_max_value = max_value
|
|
_current_value = value
|
|
_old_value = value
|
|
|
|
|
|
func set_current_value(value: float) -> void:
|
|
if value < _current_value:
|
|
_is_animation_needed = true
|
|
|
|
_current_value = value
|
|
var time := (_old_value - _current_value)/OLD_VALUE_DECRETION_RATE
|
|
|
|
if _old_value_tween and _old_value_tween.is_running():
|
|
_old_value_tween.kill()
|
|
|
|
_old_value_tween = create_tween()
|
|
_old_value_tween.tween_property(self, "_old_value", _current_value, abs(time))
|