100 lines
2.7 KiB
GDScript
100 lines
2.7 KiB
GDScript
## VERTICAL SLICE - NOT FOR PRODUCTION
|
|
## 站桩身份与命值态件(StandeeBody 拆件——单一变化原因=战斗结算快照投影的字段形态):
|
|
## 站桩是谁、活没活、血量几何的唯一账面——身份五元组(种类/名/id/护甲/顺位)+存活位+血量账与两条血量系 tween 槽。
|
|
## 无 class_name(类名缓存面纪律)——经宿主 standee_body preload 引用(st 实例名沿用);
|
|
## hp_value 属性 setter 经 _owner 回引触发宿主重绘语义逐字。
|
|
extends RefCounted
|
|
|
|
var _owner: Node2D = null
|
|
var _kind := "enemy"
|
|
var _display_name := ""
|
|
var _enemy_id := ""
|
|
var _armor := "light"
|
|
var _order := 1
|
|
var _dead := false
|
|
var _hp_max := 1.0
|
|
var _hp_cur := 0 # 血量数字显示面(HUD框架 验收「血量数字可读」)
|
|
var hp_value := 1.0: # 血条值 0..1(直角递减——tween_property 目标,逐行刷新重启不累积)
|
|
set(v):
|
|
hp_value = clampf(v, 0.0, 1.0)
|
|
_owner.queue_redraw()
|
|
var _hp_tween: Tween
|
|
var _hp_flash_tw: Tween
|
|
|
|
|
|
func _init(owner: Node2D) -> void:
|
|
_owner = owner
|
|
|
|
|
|
# ---- 公开交付与读投影面(pres封装 A2——宿主经此读写,字段保持私有)----
|
|
|
|
# 身份四元组一次交付(生成期/配置期同口——宿主 _init 与 set_data 共用)
|
|
func configure_identity(kind: String, display_name: String, enemy_id: String, armor: String) -> void:
|
|
_kind = kind
|
|
_display_name = display_name
|
|
_enemy_id = enemy_id
|
|
_armor = armor
|
|
|
|
|
|
func set_max_hp(v: float) -> void:
|
|
_hp_max = v
|
|
|
|
|
|
func set_order(i: int) -> void:
|
|
_order = i
|
|
|
|
|
|
func set_dead(v: bool) -> void:
|
|
_dead = v
|
|
|
|
|
|
func is_dead() -> bool:
|
|
return _dead
|
|
|
|
|
|
func kind() -> String:
|
|
return _kind
|
|
|
|
|
|
func armor() -> String:
|
|
return _armor
|
|
|
|
|
|
func display_name() -> String:
|
|
return _display_name
|
|
|
|
|
|
func enemy_id() -> String:
|
|
return _enemy_id
|
|
|
|
|
|
func order() -> int:
|
|
return _order
|
|
|
|
|
|
func hp_cur() -> int:
|
|
return _hp_cur
|
|
|
|
|
|
func hp_max() -> float:
|
|
return _hp_max
|
|
|
|
|
|
# 受击闪白归位(宿主 flash_hit 转调——tween 句柄留本件自持,目标=宿主 modulate)
|
|
func play_hp_flash() -> void:
|
|
if _hp_flash_tw != null and _hp_flash_tw.is_valid():
|
|
_hp_flash_tw.kill()
|
|
_hp_flash_tw = _owner.create_tween()
|
|
_hp_flash_tw.tween_property(_owner, "modulate", Color(1.6, 1.4, 1.2), UiKit.motion(0.08))
|
|
_hp_flash_tw.tween_property(_owner, "modulate", Color(1, 1, 1) if not _dead else Color(0.62, 0.62, 0.62, 0.9), UiKit.motion(0.2))
|
|
|
|
|
|
# 血条短 tween 递减(直角递减占位);逐行刷新时重启 tween 不累积
|
|
func apply_hp(hp: int) -> void:
|
|
_hp_cur = clampi(hp, 0, int(_hp_max))
|
|
var target := float(_hp_cur) / _hp_max
|
|
if _hp_tween != null and _hp_tween.is_valid():
|
|
_hp_tween.kill()
|
|
_hp_tween = _owner.create_tween()
|
|
_hp_tween.tween_property(self, "hp_value", target, UiKit.motion(0.15))
|