Files
esengine/examples/simple-matcher-usage.ts

121 lines
3.6 KiB
TypeScript
Raw Normal View History

/**
* Matcher使用示例
* QuerySystem的优雅设计
*/
import { Scene } from '../src/ECS/Scene';
import { Component } from '../src/ECS/Component';
import { Matcher } from '../src/ECS/Utils/Matcher';
// 示例组件
class Position extends Component {
constructor(public x: number = 0, public y: number = 0) {
super();
}
}
class Velocity extends Component {
constructor(public vx: number = 0, public vy: number = 0) {
super();
}
}
class Health extends Component {
constructor(public hp: number = 100) {
super();
}
}
class Dead extends Component {}
function demonstrateSimplifiedMatcher() {
console.log('=== 简化的Matcher API示例 ===\n');
// 创建场景 - QuerySystem自动创建
const scene = new Scene();
scene.begin();
// 创建测试实体
const player = scene.createEntity('Player');
player.addComponent(new Position(100, 200));
player.addComponent(new Velocity(5, 0));
player.addComponent(new Health(100));
const enemy = scene.createEntity('Enemy');
enemy.addComponent(new Position(300, 200));
enemy.addComponent(new Health(50));
const corpse = scene.createEntity('Corpse');
corpse.addComponent(new Position(150, 150));
corpse.addComponent(new Dead());
// ===== 推荐的新API =====
// 1. 直接使用scene.querySystem创建Matcher
const movingEntities = Matcher.create(scene.querySystem)
.all(Position, Velocity)
.query();
console.log('移动实体:', movingEntities.map(e => e.name));
// 2. 复合查询 - 活着的实体
const aliveEntities = Matcher.create(scene.querySystem)
.all(Health)
.none(Dead)
.query();
console.log('活着的实体:', aliveEntities.map(e => e.name));
// 3. 实用方法
const healthMatcher = Matcher.create(scene.querySystem).all(Health);
console.log(`有血量的实体数量: ${healthMatcher.count()}`);
console.log(`玩家是否有血量: ${healthMatcher.matches(player)}`);
// 4. 系统中使用Matcher的典型模式
class MovementSystem {
private movementMatcher: Matcher;
constructor(scene: Scene) {
// 在系统初始化时创建Matcher
this.movementMatcher = Matcher.create(scene.querySystem)
.all(Position, Velocity);
}
update() {
// 高效的批量查询
const movableEntities = this.movementMatcher.query();
for (const entity of movableEntities) {
const pos = entity.getComponent(Position)!;
const vel = entity.getComponent(Velocity)!;
pos.x += vel.vx;
pos.y += vel.vy;
}
}
}
// 5. 创建并使用系统
const movementSystem = new MovementSystem(scene);
movementSystem.update();
console.log('玩家更新后位置:', player.getComponent(Position));
scene.end();
}
// ===== 展示设计哲学 =====
function designPhilosophy() {
console.log('\n=== 设计哲学 ===');
console.log('✅ QuerySystem是框架核心总是存在');
console.log('✅ Matcher强制要求QuerySystem避免回退复杂性');
console.log('✅ 清晰的错误提示,引导正确使用');
console.log('✅ 旧API保持兼容但明确标记deprecated');
console.log('✅ 新API简洁明了符合现代设计原则');
}
// 运行示例
if (require.main === module) {
demonstrateSimplifiedMatcher();
designPhilosophy();
}