51 lines
1.8 KiB
TypeScript
51 lines
1.8 KiB
TypeScript
import { HeroViewComp } from "../../../hero/HeroViewComp";
|
|
import { BattleMoveComp } from "./BattleMoveComp";
|
|
import { ecs } from "../../../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
|
|
|
@ecs.register('BattleMoveSystem')
|
|
export class BattleMoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
|
|
filter(): ecs.IMatcher {
|
|
return ecs.allOf(BattleMoveComp, HeroViewComp);
|
|
}
|
|
|
|
update(e: ecs.Entity) {
|
|
const move = e.get(BattleMoveComp);
|
|
const view = e.get(HeroViewComp);
|
|
|
|
if (!move.moving) return;
|
|
|
|
// 检测攻击范围内是否有敌人
|
|
const hasEnemy = this.checkEnemiesInRange(e, view.dis);
|
|
|
|
if (!hasEnemy) {
|
|
// 计算移动量
|
|
const delta = view.speed * this.dt * move.direction;
|
|
const newX = view.node.position.x + delta;
|
|
|
|
// 限制移动范围
|
|
if (this.validatePosition(newX, move)) {
|
|
view.node.setPosition(newX, view.node.position.y, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
/** 验证目标位置有效性 */
|
|
private validatePosition(newX: number, move: BattleMoveComp): boolean {
|
|
// 我方不能超过右边界,敌方不能超过左边界
|
|
return move.direction === 1 ?
|
|
newX <= move.targetX :
|
|
newX >= move.targetX;
|
|
}
|
|
|
|
/** 检测攻击范围内敌人 */
|
|
private checkEnemiesInRange(entity: ecs.Entity, range: number): boolean {
|
|
const currentPos = entity.get(HeroViewComp).node.position;
|
|
const team = entity.get(HeroViewComp).fac;
|
|
|
|
return ecs.query(ecs.allOf(HeroViewComp)).some(e => {
|
|
const view = e.get(HeroViewComp);
|
|
return view.fac !== team &&
|
|
Math.abs(currentPos.x - view.node.position.x) <= range;
|
|
});
|
|
}
|
|
}
|