feat(bt): implement subtree status clearing in TaskRunner
Introduce `clearSubtree` to recursively reset status for an entity and all its descendants. This ensures that when a task reaches a terminal state, its entire branch is properly reset. Also refactor the Tetris example to use a sequential task node within the behavior tree.
This commit is contained in:
+14
-6
@@ -55,6 +55,9 @@ world.add(game, TickTimer);
|
||||
// Create blessed UI
|
||||
const ui = createUI();
|
||||
|
||||
// Spawn the first piece
|
||||
spawnPiece();
|
||||
|
||||
// ── Command handlers ─────────────────────────────────
|
||||
const commands = new CommandQueue(world);
|
||||
|
||||
@@ -186,24 +189,29 @@ const runner = new TaskRunner(world);
|
||||
|
||||
// Build the BT structure:
|
||||
// root (repeat)
|
||||
// ├── handleInput (leaf)
|
||||
// ├── gravityTick (leaf)
|
||||
// └── render (leaf)
|
||||
// └── seq (sequential)
|
||||
// ├── handleInput (leaf)
|
||||
// ├── gravityTick (leaf)
|
||||
// └── render (leaf)
|
||||
|
||||
const root = world.spawn();
|
||||
world.add(root, Task, { kind: "repeat" });
|
||||
|
||||
const seq = world.spawn();
|
||||
world.add(seq, Task, { kind: "sequential" });
|
||||
world.relate(seq, ChildOf, root);
|
||||
|
||||
const handleInputTask = world.spawn();
|
||||
world.add(handleInputTask, Task, { kind: "leaf" });
|
||||
world.relate(handleInputTask, ChildOf, root);
|
||||
world.relate(handleInputTask, ChildOf, seq);
|
||||
|
||||
const gravityTask = world.spawn();
|
||||
world.add(gravityTask, Task, { kind: "leaf" });
|
||||
world.relate(gravityTask, ChildOf, root);
|
||||
world.relate(gravityTask, ChildOf, seq);
|
||||
|
||||
const renderTask = world.spawn();
|
||||
world.add(renderTask, Task, { kind: "leaf" });
|
||||
world.relate(renderTask, ChildOf, root);
|
||||
world.relate(renderTask, ChildOf, seq);
|
||||
|
||||
// ── Leaf handlers ────────────────────────────────────
|
||||
runner.onLeaf = (_w, entity) => {
|
||||
|
||||
Reference in New Issue
Block a user