You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
3.0 KiB
GDScript

extends Control
@onready var headbar_scene: PackedScene = preload("res://scene/ui/item/headbar.tscn")
@onready var camera: CameraManager = Global.camera_mgr
class HeadbarMeta:
var pos: Vector3
var headbar: Headbar
var headbar_map: Dictionary = {}
func _ready():
SignalManager.character_create.connect(on_character_create)
SignalManager.character_ui_pos_changed.connect(on_character_ui_pos_changed)
SignalManager.character_destroy.connect(on_character_destroy)
SignalManager.character_status_changed.connect(on_character_status_changed)
SignalManager.character_hit_text.connect(on_character_hit_text)
SignalManager.character_hit_damage.connect(on_character_hit_damage)
SignalManager.character_die.connect(on_character_die)
func _process(delta):
for k in headbar_map:
var headbar_meta: HeadbarMeta = headbar_map[k] as HeadbarMeta
headbar_meta.headbar.position = camera.get_screen_pos(headbar_meta.pos)
func on_character_create(id: int, type: int, pos: Vector3) -> void:
if type != Enum.ECharacterType.Monster:
return
var new_headbar_meta = HeadbarMeta.new()
var new_headbar: Headbar = headbar_scene.instantiate() as Headbar
new_headbar_meta.pos = pos
new_headbar_meta.headbar = new_headbar
new_headbar.set_debug_info_show(get_tree().debug_collisions_hint)
add_child(new_headbar)
on_character_ui_pos_changed(id, pos)
headbar_map[id] = new_headbar_meta
func on_character_ui_pos_changed(id: int, pos: Vector3) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar_meta.pos = pos
headbar.position = camera.get_screen_pos(pos)
func on_character_destroy(id: int) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.queue_free()
headbar_map.erase(id)
func on_character_status_changed(id: int, status_name: String, value) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
var func_name: String = "on_%s_changed" % status_name
if headbar.has_method(func_name):
headbar.call(func_name, value)
func on_character_hit_text(id: int, value: String) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.on_hit_text(value)
func on_character_hit_damage(id: int, value: float) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.on_hit_damage(value)
func on_character_die(id: int) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.queue_free()
headbar_map.erase(id)