refactor(普通关刷怪): 调整刷怪间隔并新增怪物砸地击退效果

1. 将普通关后续刷怪间隔从1秒改为2秒,同步更新注释与配置常量
2. 为普通关怪物添加从400码高度掉落入场的效果
3. 新增怪物落地震退逻辑,击退落点100码范围内的英雄
This commit is contained in:
pan
2026-09-11 15:39:57 +08:00
parent dc67f42a33
commit ab32b0e09d
4 changed files with 42 additions and 6 deletions

View File

@@ -28,6 +28,10 @@ export class Monster extends ecs.Entity {
static readonly MAX_POOL_SIZE: number = 12;
/** 所有路径合计池容量上限 */
static readonly MAX_POOL_TOTAL: number = 60;
/** 落地震退范围(码):怪物砸地时击退落点范围内的英雄 */
static readonly LANDING_SHOCK_RANGE: number = 100;
/** 英雄实体查询匹配器(惰性缓存,落地震退用) */
private static heroMatcher: any = null;
/** 计算当前所有对象池节点总量 */
private static totalPoolSize(): number {
@@ -279,6 +283,11 @@ export class Monster extends ecs.Entity {
collider.apply();
}
// 高处砸地:震退落点范围内的英雄
if (dropDistance > 0) {
this.applyLandingShock(pos.x);
}
// 落地后触发 call 技能
SkillTriggerHelper.trigger(SkillTriggerType.Call, model, view);
};
@@ -302,6 +311,33 @@ export class Monster extends ecs.Entity {
}
/**
* 落地震退:怪物从高处砸地时,击退落点 LANDING_SHOCK_RANGE 范围内的英雄
* Why: 复用 HeroAtkSystem 的击退通道(MoveComp.knockbackVelocity),
* 由 MoveSystem 统一指数衰减位移并受 HERO 左边界钳制,不会把英雄推出屏幕
* @param posX 落点 X 坐标
*/
private applyLandingShock(posX: number) {
if (!Monster.heroMatcher) {
Monster.heroMatcher = ecs.allOf(HeroAttrsComp);
}
// 击退初速度 = 距离 × 16(0.1s 时间常数衰减,总位移约等于距离),与 HeroAtkSystem 一致
const knockbackSpeed = FightSet.BACK_RANG * 16;
ecs.query(Monster.heroMatcher).forEach(entity => {
const attrs = entity.get(HeroAttrsComp);
const view = entity.get(HeroViewComp);
if (!attrs || !view || attrs.is_dead || attrs.fac !== FacSet.HERO) return;
if (!view.node || !view.node.isValid) return;
// 仅按 X 轴距离判定(纵向战场无意义)
if (Math.abs(view.node.position.x - posX) > Monster.LANDING_SHOCK_RANGE) return;
const move = entity.get(MoveComp);
if (move) {
// 英雄被击退方向为负(向左后退),叠加而非覆盖,避免打断已有击退
move.knockbackVelocity -= knockbackSpeed;
}
});
}
/** 重置入口:复用 destroy 的释放流程 */
reset() {
super.destroy();