feat: 新增英雄召唤事件并优化UI布局与组件注释

- 在 MissionHeroComp 中召唤英雄后派发 MasterCalled 事件,以更新英雄信息面板
- 调整 hnode.prefab 中多个节点的位置和尺寸,优化界面布局
- 为多个 TypeScript 组件文件添加详细注释,说明职责、关键设计和依赖关系
- 在 MissionCardComp 中完善英雄信息面板的创建、排序和布局逻辑
This commit is contained in:
walkpan
2026-04-07 19:52:40 +08:00
parent e880613f8f
commit 81a07bc16c
12 changed files with 2952 additions and 2639 deletions

View File

@@ -1,3 +1,27 @@
/**
* @file MoveUV.ts
* @description UV 滚动动画组件(视觉效果层)
*
* 职责:
* 1. 通过每帧修改 Sprite 的 spriteFrame.rect 偏移量,
* 实现纹理的 **UV 滚动效果**(如流水、云层、传送带等)。
* 2. 支持 X / Y 轴独立的滚动速度控制。
* 3. 支持动态切换纹理包裹模式WrapMode
*
* 关键设计:
* - 使用 spriteFrame.rect 的 x / y 偏移模拟 UV 滚动,
* 纹理 WrapMode 必须设为 REPEAT 才能看到循环滚动效果。
* - packable=false禁止图集自动打包确保纹理独立加载以支持 REPEAT 模式。
* - 每帧调用 markForUpdateRenderData() 强制刷新渲染数据,
* 确保 rect 变化能即时反映到渲染管线。
*
* 使用方式:
* 挂载在带有 Sprite 的节点上,设置 moveSpeedX / moveSpeedY 和 wrapMode。
*
* 依赖:
* - cc.Sprite —— 读写 spriteFrame.rect
* - cc.Texture2D.WrapMode —— 控制纹理采样的循环方式
*/
import { Texture2D } from 'cc';
import { Enum } from 'cc';
import { rect } from 'cc';
@@ -5,26 +29,45 @@ import { Sprite } from 'cc';
import { _decorator, Component } from 'cc';
const { ccclass, property } = _decorator;
/**
* MoveUV —— UV 滚动动画组件
*
* 通过修改 Sprite 的 rect 偏移实现纹理循环滚动。
* 适用于水面、云层、传送带等需要连续滚动的视觉效果。
*/
@ccclass('MoveUV')
export class MoveUV extends Component {
/** X 轴滚动速度(像素/秒,正值向右,负值向左) */
@property
moveSpeedX = 0;
/** Y 轴滚动速度(像素/秒,正值向上,负值向下) */
@property
moveSpeedY = 0;
/** 纹理包裹模式(默认 REPEAT循环滚动必须使用此模式 */
@property({ type: Enum(Texture2D.WrapMode) })
wrapMode = Texture2D.WrapMode.REPEAT;
/** Sprite 组件引用 */
private _sprite: Sprite;
/** 当前 rect 偏移量(修改 x / y 实现滚动) */
private _rect = rect();
/** 上一次应用的 WrapMode用于检测变化 */
private _currentWrapMode: number;
/** 获取当前 rect供外部读取偏移状态 */
getRect() {
return this._rect;
}
/**
* 初始化:
* 1. 获取 Sprite 组件(不存在则抛出异常)。
* 2. 记录初始 rect 尺寸。
* 3. 禁止自动打包packable=false确保纹理独立以支持 REPEAT。
*/
onLoad() {
this._sprite = this.getComponent(Sprite);
if (!this._sprite) {
@@ -35,14 +78,23 @@ export class MoveUV extends Component {
this._sprite.spriteFrame.packable = false;
}
/**
* 帧更新:
* 1. 检测 WrapMode 是否变化,变化则重新设置纹理参数。
* 2. 按速度累加 rect 的 x / y 偏移。
* 3. 将新 rect 赋回 spriteFrame 并标记渲染数据更新。
*/
update(dt: number) {
// 动态切换 WrapMode
if (this._currentWrapMode !== this.wrapMode) {
this._currentWrapMode = this.wrapMode;
this._sprite.spriteFrame.texture.setWrapMode(this.wrapMode, this.wrapMode);
}
// 累加 UV 偏移
this._rect.x += this.moveSpeedX * dt;
this._rect.y += this.moveSpeedY * dt;
// 应用新 rect 并强制刷新渲染
this._sprite.spriteFrame.rect = this._rect;
this._sprite.markForUpdateRenderData();
}