在 HInfoComp 组件中新增 icon_node 属性,用于在预制件中引用图标节点。同时更新了 hnode.prefab 的配置,添加了对应的 Sprite 和 Animation 组件,以支持英雄图标的显示和动画效果。
69 lines
2.0 KiB
TypeScript
69 lines
2.0 KiB
TypeScript
import { _decorator, Label, Node } from "cc";
|
|
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
|
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
|
|
import { HeroAttrsComp } from "../hero/HeroAttrsComp";
|
|
|
|
const {property, ccclass } = _decorator;
|
|
|
|
/** 视图层对象 */
|
|
@ccclass('HInfoComp')
|
|
@ecs.register('HInfoComp', false)
|
|
export class HInfoComp extends CCComp {
|
|
@property(Node)
|
|
icon_node=null!
|
|
private eid: number = 0;
|
|
private model: HeroAttrsComp | null = null;
|
|
private apLabel: Label | null = null;
|
|
private hpLabel: Label | null = null;
|
|
|
|
onLoad() {
|
|
this.cacheLabels();
|
|
}
|
|
|
|
bindData(eid: number, model: HeroAttrsComp) {
|
|
this.eid = eid;
|
|
this.model = model;
|
|
this.cacheLabels();
|
|
this.refresh();
|
|
}
|
|
|
|
refresh() {
|
|
if (!this.model) return;
|
|
if (this.apLabel) {
|
|
this.apLabel.string = `${Math.max(0, Math.floor(this.model.ap ?? 0))}`;
|
|
}
|
|
if (this.hpLabel) {
|
|
this.hpLabel.string = `${Math.max(0, Math.floor(this.model.hp_max ?? 0))}`;
|
|
}
|
|
}
|
|
|
|
isModelAlive(): boolean {
|
|
return !!(this.model as any)?.ent;
|
|
}
|
|
|
|
private cacheLabels() {
|
|
if (!this.apLabel) {
|
|
this.apLabel = this.findLabelByPath(["ap", "val"]);
|
|
}
|
|
if (!this.hpLabel) {
|
|
this.hpLabel = this.findLabelByPath(["hp", "val"]);
|
|
}
|
|
}
|
|
|
|
private findLabelByPath(path: string[]): Label | null {
|
|
let current: Node | null = this.node;
|
|
for (let i = 0; i < path.length; i++) {
|
|
current = current?.getChildByName(path[i]) ?? null;
|
|
if (!current) return null;
|
|
}
|
|
return current.getComponent(Label) || current.getComponentInChildren(Label);
|
|
}
|
|
|
|
/** 视图对象通过 ecs.Entity.remove(ModuleViewComp) 删除组件是触发组件处理自定义释放逻辑 */
|
|
reset() {
|
|
this.model = null;
|
|
this.eid = 0;
|
|
this.node.destroy();
|
|
}
|
|
}
|