Files
pixelheros/assets/script/game/map/HInfoComp.ts
walkpan f436e47d8d feat(地图): 为英雄信息组件添加图标节点属性
在 HInfoComp 组件中新增 icon_node 属性,用于在预制件中引用图标节点。同时更新了 hnode.prefab 的配置,添加了对应的 Sprite 和 Animation 组件,以支持英雄图标的显示和动画效果。
2026-03-25 20:37:12 +08:00

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();
}
}