121 lines
3.6 KiB
TypeScript
121 lines
3.6 KiB
TypeScript
/**
|
||
* 简化后的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();
|
||
} |