血条逻辑
parent
7b0b8335a0
commit
a3985ef818
@ -0,0 +1,36 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://dy0u26ba7dle"]
|
||||
|
||||
[ext_resource type="Script" path="res://script/ui/headbar/headbar.gd" id="1_j1xlt"]
|
||||
[ext_resource type="Texture2D" uid="uid://cwhu1ec03t3c8" path="res://resource/ui/hud/headbar_hp_empty.png" id="2_g5t31"]
|
||||
[ext_resource type="Texture2D" uid="uid://b4ly1exl0owck" path="res://resource/ui/hud/headbar_hp.png" id="3_vh1p5"]
|
||||
|
||||
[node name="HeadBar" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 0
|
||||
offset_left = 256.0
|
||||
offset_top = 88.0
|
||||
offset_right = 256.0
|
||||
offset_bottom = 88.0
|
||||
script = ExtResource("1_j1xlt")
|
||||
|
||||
[node name="HpBar" type="TextureProgressBar" parent="."]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -32.0
|
||||
offset_top = -8.0
|
||||
offset_right = 32.0
|
||||
offset_bottom = 8.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
value = 50.0
|
||||
stretch_margin_left = 10
|
||||
stretch_margin_top = 10
|
||||
stretch_margin_right = 10
|
||||
stretch_margin_bottom = 10
|
||||
texture_under = ExtResource("2_g5t31")
|
||||
texture_progress = ExtResource("3_vh1p5")
|
||||
@ -0,0 +1,3 @@
|
||||
extends Node3D
|
||||
|
||||
var camera:CameraManager
|
||||
@ -0,0 +1,27 @@
|
||||
extends Camera3D
|
||||
class_name CameraManager
|
||||
|
||||
var target:int
|
||||
var offset:Vector3
|
||||
|
||||
func _ready():
|
||||
Global.camera = self
|
||||
SignalManager.character_create.connect(on_character_create)
|
||||
SignalManager.character_pos_changed.connect(on_character_pos_changed)
|
||||
SignalManager.character_destroy.connect(on_character_destroy)
|
||||
|
||||
func _process(delta):
|
||||
pass
|
||||
|
||||
func on_character_create(id:int,team:Enum.ETeam,pos:Vector3):
|
||||
if team == Enum.ETeam.Player:
|
||||
target = id
|
||||
offset = position - pos
|
||||
|
||||
func on_character_pos_changed(id:int,pos:Vector3):
|
||||
if id == target:
|
||||
position = pos + offset
|
||||
|
||||
func on_character_destroy(id:int):
|
||||
target = 0
|
||||
offset = Vector3.ZERO
|
||||
@ -0,0 +1,16 @@
|
||||
extends Control
|
||||
class_name Headbar
|
||||
|
||||
@onready var hpbar = (%HpBar as TextureProgressBar)
|
||||
|
||||
func _ready():
|
||||
pass
|
||||
|
||||
func _process(delta):
|
||||
pass
|
||||
|
||||
func on_hp_changed(value):
|
||||
hpbar.value = value
|
||||
|
||||
func on_hp_max_changed(value):
|
||||
hpbar.max_value = value
|
||||
@ -0,0 +1,59 @@
|
||||
extends Control
|
||||
|
||||
@onready var headbar_scene = preload("res://scene/ui/item/headbar.tscn")
|
||||
@onready var camera: CameraManager = Global.camera
|
||||
|
||||
class HeadbarMeta:
|
||||
var pos:Vector3
|
||||
var headbar:Headbar
|
||||
|
||||
var headbar_map = {}
|
||||
|
||||
func _ready():
|
||||
SignalManager.character_create.connect(on_character_create)
|
||||
SignalManager.character_pos_changed.connect(on_character_pos_changed)
|
||||
SignalManager.character_destroy.connect(on_character_destroy)
|
||||
SignalManager.character_status_changed.connect(on_character_status_changed)
|
||||
|
||||
func _process(delta):
|
||||
var camera_pos = camera.position
|
||||
for k in headbar_map:
|
||||
var headbar_meta = headbar_map[k] as HeadbarMeta
|
||||
headbar_meta.headbar.position = camera.unproject_position(headbar_meta.pos)
|
||||
|
||||
func on_character_create(id:int,team:Enum.ETeam,pos:Vector3):
|
||||
if team == Enum.ETeam.Player:
|
||||
return
|
||||
var new_headbar_meta = HeadbarMeta.new()
|
||||
new_headbar_meta.pos = pos
|
||||
var new_headbar = headbar_scene.instantiate()
|
||||
add_child(new_headbar)
|
||||
new_headbar_meta.headbar = new_headbar
|
||||
on_character_pos_changed(id,pos)
|
||||
headbar_map[id] = new_headbar_meta
|
||||
|
||||
func on_character_pos_changed(id:int,pos:Vector3):
|
||||
if not id in headbar_map:
|
||||
return
|
||||
var headbar_meta = headbar_map[id]
|
||||
var headbar = headbar_meta.headbar as Headbar
|
||||
headbar_meta.pos = pos
|
||||
headbar.position = camera.unproject_position(pos)
|
||||
|
||||
func on_character_destroy(id:int):
|
||||
if not id in headbar_map:
|
||||
return
|
||||
var headbar_meta = headbar_map[id]
|
||||
var headbar = headbar_meta.headbar as Headbar
|
||||
headbar.queue_free()
|
||||
headbar_map.erase(id)
|
||||
|
||||
func on_character_status_changed(id:int,status_name:String,value):
|
||||
if not id in headbar_map:
|
||||
return
|
||||
var headbar_meta = headbar_map[id]
|
||||
var headbar = headbar_meta.headbar as Headbar
|
||||
var func_name = "on_%s_changed" % status_name
|
||||
if headbar.has_method(func_name):
|
||||
headbar.call(func_name,value)
|
||||
|
||||
Loading…
Reference in New Issue