refactor(mission): 优化节间过场表现与关卡流程

1. 新增地图滚动速度重置与背景动画加速逻辑,强化过场推进感
2. 重构节间过场流程,同步启动英雄归位与地图滚动
3. 调整关卡文本显示格式与字体大小,优化视觉体验
4. 新增全局移动锁控制英雄过场动画状态,修复动画残留问题
This commit is contained in:
panFD
2026-09-12 22:41:51 +08:00
parent 1b2545deec
commit 10e2c0d817
5 changed files with 74 additions and 28 deletions

View File

@@ -45,6 +45,13 @@ export class MoveComp extends ecs.Comp {
@ecs.register('MoveSystem')
export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
/**
* 节间过场移动动画锁(全局):
* 置位期间,存活英雄即使已归位到编队槽位也保持"move"移动动画(配合地图滚动,表现行军推进)。
* 由 MissionComp 在节间过场开始(背景滚动启动)时置 true、过场结束(背景滚动停止)时置 false。
*/
public static transitionMoveLock = false;
/** 渲染层级重排节流,避免每帧排序 */
private readonly renderSortInterval = 0.05;
private lastRenderSortAt = 0;
@@ -65,6 +72,8 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
private static readonly QUEUE_LEFT_LIMIT = FightSet.HERO_ROW_BACK_X - 120;
/** 编队槽位默认间隔(像素);后排人数过多时自动压缩间距 */
private static readonly QUEUE_SPACING = 30;
/** 编队归位目标时长(秒):任意距离动态提速,保证约 1s 到位 */
private static readonly QUEUE_ARRIVE_TIME = 1;
/** 编队槽位重算节流间隔(秒):召唤/死亡后最多延迟一次重算 */
private readonly queueRebuildInterval = 0.1;
private lastQueueRebuildAt = 0;
@@ -181,18 +190,30 @@ export class MoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
view.node.setPosition(targetX, view.node.position.y, 0);
}
view.scale = 1;
view.status_change("idle");
// 节间过场锁定期:即使已归位也保持移动动画(配合地图滚动表现行军推进),过场结束才回待机
if (MoveSystem.transitionMoveLock) {
view.status_change("move");
} else {
view.status_change("idle");
}
return;
}
/** 未到位:向槽位推进(与战斗推进同速),朝移动方向转身 */
/** 未到位:向槽位推进,朝移动方向转身 */
const dir = targetX > selfX ? 1 : -1;
move.direction = dir;
view.scale = dir;
/** 编队排队允许突破战斗左边界(LETF_END=后排锚点),扩展至 QUEUE_LEFT_LIMIT */
const queueClamp = (x: number): number => Math.max(MoveSystem.QUEUE_LEFT_LIMIT, x);
const delta = (model.speed / 3) * this.dt * dir;
const newX = queueClamp(selfX + delta);
/** 归位速度:按剩余距离动态计算,保证任意距离约 1s 到位;不低于基础移速,避免近距离僵住 */
const dist = Math.abs(targetX - selfX);
const speed = Math.max(model.speed / 3, dist / MoveSystem.QUEUE_ARRIVE_TIME);
const delta = speed * this.dt * dir;
let newX = queueClamp(selfX + delta);
/** 防过冲:本帧会越过目标则直接贴齐 */
if ((dir > 0 && newX > targetX) || (dir < 0 && newX < targetX)) {
newX = targetX;
}
if (Math.abs(newX - selfX) >= 0.01) {
view.node.setPosition(newX, view.node.position.y, 0);
view.status_change("move");