|
动画组件(动画组件.js)——完整使用文档
(基于 2025-07 的最新同步版)
================================================================
一、核心概念
================================================================
1. 外观(Skin)
一套共享序列帧素材,可由多个「来源」组成
- 类型 1:文件夹 `…/x.txt + 1.png ~ N.png`
- 类型 2:ZIP(ani.json + 图集)—暂未启用
2. 外观总表 `window.MX_APPEAR`(唯一真源)
```
MX_APPEAR[外观名] = {
cfgs : [{ 类型, 基础 } …], // 每条 = 一种来源
meta : { 方向数, mirrorPairs, 锚点像素X, 锚点像素Y },
frameDefs : { 动作名 : { …完整动作配置… } },
baseStart : 1, // 文件夹起始帧
clips : { act -> dir -> clip },
actionMirrorMap : { act -> {dir:mirrorDir} }
users : Set<实例ID>, // 引用计数
status : 'unloaded' | 'loading' | 'ready'
}
```
3. clip 描述(所有实例共享)
```
{ start : <起始下标>,
len : <帧数>,
fps : <帧率>,
offsets : Float32Array(subarray),
anchor : {x,y},
flip : false | true }
```
================================================================
二、动作配置(frameDef)字段
================================================================
必填
• 起始帧 (number) 本动作第一帧(从 1 开始)
• 帧数 (number) 总帧数(单方向)
可选
• fps (number) 默认为 10
• 方向 (1 2 4 5 8) 默认为 1
• 翻转 (array) 形如 `[[1,3],[2,4]]`
• 锚点x/y (number) 覆盖外观级锚点
• 播放次数 (number) -1=无限(默认);>0 播完停止
================================================================
三、初始化配置 cfg
================================================================
名称-模式 (推荐)
```
{
名称 : '外观A', // 必填
// ↓ 全为可选:若写入会合并到 MX_APPEAR[名称].meta / frameDefs
动作列表 : { …frameDefs… },
起始帧 : 1,
方向数 : 8,
mirrorPairs : [[5,3],[6,2]],
锚点像素X : 256,
锚点像素Y : 256
}
```
路径模板模式(兼容旧代码)
```
{
路径 : '…/{action}_{dir}_{frame}.png', // 必填
动作列表 : { …必填… },
方向数 : 8,
mirrorPairs : …,
起始帧 : 1,
锚点像素X/Y : …
}
```
================================================================
四、静态 API(类方法)
================================================================
1. 批量注册
```js
动画组件.批量注册([ cfgObj, … ])
```
• cfgObj 字段同“初始化 cfg”,必含 `类型/外观/路径`
• 已存在同名+同路径时覆盖;可多次调用
2. 卸载外观 / 动作 / 方向
```js
动画组件.卸载外观('外观A');
动画组件.卸载动作('外观A','走路');
动画组件.卸载方向('外观A','走路',3);
```
• 引用计数 `users.size==0` 时才能真正销毁;否则实例会透明→懒加载
3. 内部 Loader(自动调用)
```js
动画组件._ensureAppearanceLoaded('外观A');
```
================================================================
五、实例 API
================================================================
| 方法 | 说明 |
|------------------------------------|------|
| 初始化(x,y,cfg) | 创建并加载外观 |
| 播放(action, dir=0, loop=true,<unloadPrev>) | 播放动作;`unloadPrev` 为 true 时卸载上一个动作纹理 |
| 设置状态(action,<loop>) | 仅换动作 |
| 设置方向(dir,<loop>) | 仅换方向 |
| 暂停 / 继续 | 控制播放 |
| 设置速度(speed) | 倍速 |
| 设置帧(idx) / 设置进度(0-1) | 定位 |
| 添加动作(name, frameDef) | 运行期追加动作(名称模式会写入 frameDefs 并重切片) |
| 设置外观('外观B') | 切换外观 |
| 设置自动卸载动作(bool) | 开/关「切动作→销旧纹理」 |
| 销毁资源() | 仅销毁本实例的 clip 纹理 |
| 销毁() | 移除 Ticker & Container,users-1 |
事件(on/off/once)
• '初始化完成' • '外观切换完成' • '动作已加载' • '加载错误'
================================================================
六、典型流程示例
================================================================
```js
// 1. 启动:批量注册
动画组件.批量注册([
{ 类型:1, 外观:'外观A', 路径:'http://…/1/', 起始帧:1, 动作列表:{ 站立:{…}, 走路:{…} } },
{ 类型:1, 外观:'外观B', 路径:'http://…/2/' }
]);
// 2. 实例化
const role = new 动画组件();
role.on('初始化完成', () => role.播放('站立',0,true));
role.初始化(100,200,{ 名称:'外观A' });
// 3. 切动作 & 自动卸载上一动作
role.设置自动卸载动作(true);
role.播放('走路',2,true); // 站立纹理立即释放
// 4. 动态添加新动作
role.添加动作('攻击',{ 起始帧:97, 帧数:60, fps:12, 方向:8 });
role.播放('攻击',0,false);
// 5. 切换皮肤
role.设置外观('外观B');
// 6. 全局显存清理
动画组件.卸载外观('外观A');
```
这样即可在多实例、频繁切换动作/外观的场景下,确保
• 纹理 & 偏移数组全局唯一复用
• 可以按外观 / 动作 / 方向粒度释放
• 自动懒加载,始终可见、无红字报错
• 显存占用保持在“当前动作 ± 缓存阈值” 수준。 |
|