Files
pixelheros/assets/script/game/map/view/MoveUV.ts
walkpan 81a07bc16c feat: 新增英雄召唤事件并优化UI布局与组件注释
- 在 MissionHeroComp 中召唤英雄后派发 MasterCalled 事件,以更新英雄信息面板
- 调整 hnode.prefab 中多个节点的位置和尺寸,优化界面布局
- 为多个 TypeScript 组件文件添加详细注释,说明职责、关键设计和依赖关系
- 在 MissionCardComp 中完善英雄信息面板的创建、排序和布局逻辑
2026-04-07 19:52:40 +08:00

102 lines
3.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @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';
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) {
let tempStr = "获取Sprite失败";
throw new Error(tempStr);
}
this._rect.set(this._sprite.spriteFrame.rect);
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();
}
}