mirror of
https://github.com/gongxh0901/kunpocc-behaviortree.git
synced 2025-12-26 16:48:56 +00:00
113 lines
2.4 KiB
TypeScript
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;
|
||
|
|
}
|