refactor(mission): 优化节间过场表现与关卡流程
1. 新增地图滚动速度重置与背景动画加速逻辑,强化过场推进感 2. 重构节间过场流程,同步启动英雄归位与地图滚动 3. 调整关卡文本显示格式与字体大小,优化视觉体验 4. 新增全局移动锁控制英雄过场动画状态,修复动画残留问题
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user