Files
kunpocc-behaviortree/src/behaviortree/BTNode/BaseNode.ts
gongxh 0d9f048f39 init
2025-06-04 23:10:59 +08:00

113 lines
2.4 KiB
TypeScript

import { createUUID, Status } from "../header";
import { Ticker } from "../Ticker";
/**
* 基础节点
* 所有节点全部继承自 BaseNode
*/
export abstract class BaseNode {
/** 唯一标识 */
public id: string;
/** 子节点 */
public children: BaseNode[];
/**
* 创建
* @param children 子节点列表
*/
constructor(children?: BaseNode[]) {
this.id = createUUID();
this.children = [];
if (!children) {
return;
}
for (let i = 0; i < children.length; i++) {
this.children.push(children[i]);
}
}
/**
* 执行节点
* @param ticker 更新器
* @returns {Status} 状态
*/
public _execute(ticker: Ticker): Status {
/* ENTER */
this._enter(ticker);
if (!ticker.blackboard.get("isOpen", ticker.tree.id, this.id)) {
this._open(ticker);
}
let status = this._tick(ticker);
if (status !== Status.RUNNING) {
this._close(ticker);
}
this._exit(ticker);
return status;
}
/**
* 进入节点
* @param ticker 更新器
* @internal
*/
public _enter(ticker: Ticker): void {
ticker.enterNode(this);
this.enter(ticker);
}
/**
* 打开节点
* @param ticker 更新器
* @internal
*/
public _open(ticker: Ticker): void {
ticker.openNode(this);
ticker.blackboard.set("isOpen", true, ticker.tree.id, this.id);
this.open(ticker);
}
/**
* 更新节点
* @param ticker 更新器
* @internal
*/
public _tick(ticker: Ticker): Status {
ticker.tickNode(this);
return this.tick(ticker);
}
/**
* 关闭节点
* @param ticker 更新器
* @internal
*/
public _close(ticker: Ticker): void {
ticker.closeNode(this);
ticker.blackboard.set("isOpen", false, ticker.tree.id, this.id);
this.close(ticker);
}
/**
* 退出节点
* @param ticker 更新器
* @internal
*/
public _exit(ticker: Ticker): void {
ticker.exitNode(this);
this.exit(ticker);
}
enter(ticker: Ticker): void {
}
open(ticker: Ticker): void {
}
close(ticker: Ticker): void {
}
exit(ticker: Ticker): void {
}
abstract tick(ticker: Ticker): Status;
}