CocosCreator_ECS/assets/Script/ECS/systems/SysRoleState.ts
2022-03-22 15:35:41 +08:00

84 lines
3.4 KiB
TypeScript

import { EventDeath, EventGraphicsDraw, EventHPChange, EventHurt, EventRun, EventStand } from "../../Struct/NodeEvent";
import { ComAttackable } from "../components/ComAttackable";
import { ComBehaviorTree } from "../components/ComBehaviorTree";
import { ComCocosNode } from "../components/ComCocosNode";
import { ComMonitor } from "../components/ComMonitor";
import { ComMovable } from "../components/ComMovable";
import { ComNodeConfig } from "../components/ComNodeConfig";
import { ComRoleConfig } from "../components/ComRoleConfig";
import { ECSSystem } from "../lib/ECSSystem";
import { ECSWorld, GenFillterKey } from "../lib/ECSWorld";
const FILTER_ROLE_NODE = GenFillterKey([ComCocosNode, ComRoleConfig]);
export class SysRoleState extends ECSSystem {
/** 连接 */
public onAdd(world: ECSWorld): void {
}
/** 断开连接 */
public onRemove(world: ECSWorld): void {
}
/** 添加实体 */
public onEntityEnter(world: ECSWorld, entity: number): void {
}
/** */
public onEntityLeave(world: ECSWorld, entity: number): void {
}
/** 更新 */
public onUpdate(world: ECSWorld, dt: number): void {
world.getFilter(FILTER_ROLE_NODE).walk((entity: number) => {
let comCocosNode = world.getComponent(entity, ComCocosNode);
if(!comCocosNode.loaded) return ;
let comRoleConfig = world.getComponent(entity, ComRoleConfig);
let comMovable = world.getComponent(entity, ComMovable);
let comMonitor = world.getComponent(entity, ComMonitor);
let comAttackable = world.getComponent(entity, ComAttackable);
comCocosNode.events.push(new EventGraphicsDraw([]));
if(comMonitor && comMonitor.debugInfo) {
comCocosNode.events.push(new EventGraphicsDraw(comMonitor.debugInfo.points, comMonitor.debugInfo.color));
}
if(comAttackable && comAttackable.debugInfo) {
comCocosNode.events.push(new EventGraphicsDraw(comAttackable.debugInfo.points, comAttackable.debugInfo.color));
}
if(comMovable && comMovable.speedDirty) {
comMovable.speedDirty = false;
if(comMovable.speed > 0) {
comCocosNode.events.push(new EventRun());
}else {
comCocosNode.events.push(new EventStand());
}
}
if(comRoleConfig && comRoleConfig.HPDirty) {
comCocosNode.events.push(new EventHPChange(comRoleConfig.maxHP, comRoleConfig.lastHP, comRoleConfig.nowHP));
if(comRoleConfig.lastHP > comRoleConfig.nowHP) {
comCocosNode.events.push(new EventHurt());
}
if(comRoleConfig.nowHP <= 0) {
comCocosNode.events.push(new EventDeath(() => {
world.removeComponent(entity, ComNodeConfig);
world.removeComponent(entity, ComCocosNode);
world.removeEntity(entity);
comCocosNode.node.destroy();
}));
world.removeComponent(entity, ComBehaviorTree);
world.removeComponent(entity, ComMonitor);
world.removeComponent(entity, ComMovable);
world.removeComponent(entity, ComRoleConfig);
}
comRoleConfig.HPDirty = false;
}
return false;
});
}
}