///
import { Component } from '@eva/eva.js';
import { ComponentChanged } from '@eva/eva.js';
import { Container } from 'pixi.js';
import { ContainerManager } from '@eva/plugin-renderer';
import { GameObject } from '@eva/eva.js';
import { Renderer } from '@eva/plugin-renderer';
import { RendererManager } from '@eva/plugin-renderer';
import { RendererSystem } from '@eva/plugin-renderer';
import { UpdateParams } from '@eva/eva.js';
/**
* Spine 骨骼动画组件
*
* Spine 组件用于播放 Esoteric Software 的 Spine 骨骼动画。
* 支持骨骼动画播放控制、动画混合、附件替换等高级功能,
* 适用于角色动画、复杂特效等需要骨骼动画的场景。
*
* 主要功能:
* - 骨骼动画播放和控制
* - 动画轨道管理(多动画并行)
* - 动画混合过渡
* - 骨骼和附件访问
* - 支持 Spine 3.6 和 3.8 版本
*
* @example
* ```typescript
* // 创建 Spine 动画
* const character = new GameObject('character');
* const spine = new Spine({
* resource: 'heroSpine', // Spine 资源
* animationName: 'idle', // 默认动画
* autoPlay: true, // 自动播放
* scale: 0.5 // 缩放比例
* });
* character.addComponent(spine);
*
* // 播放动画
* spine.play('walk', true); // 循环播放 walk 动画
*
* // 停止动画
* spine.stop();
*
* // 动画混合
* spine.setMix('idle', 'walk', 0.3); // 设置过渡时间
* spine.play('walk');
*
* // 添加动画队列
* spine.play('attack', false); // 播放攻击动画
* spine.addAnimation('idle', 0, true); // 攻击完成后回到 idle
*
* // 替换附件(换装)
* spine.setAttachment('weapon', 'sword'); // 将武器槽替换为剑
*
* // 访问骨骼
* const headBone = spine.getBone('head');
* if (headBone) {
* headBone.rotation = 15; // 旋转头部
* }
*
* // 多轨道动画
* spine.play('walk', true, 0); // 轨道0:身体动画
* spine.play('shoot', false, 1); // 轨道1:上半身动画
* ```
*/
export declare class Spine extends Component {
/** 组件名称 */
static componentName: string;
/** Spine 资源名称 */
resource: string;
/** 动画缩放比例 */
scale: number;
/** 当前播放的动画名称 */
animationName: string;
/** 是否自动播放动画 */
autoPlay: boolean;
/** 是否保留资源(销毁时不释放) */
keepResource: boolean;
/** Spine 骨架实例(内部使用) */
private _armature;
/** 容器管理器引用(由 SpineSystem 设置) */
_containerManager: any;
/** 挂载到插槽的 GameObject 映射(GameObject -> { slot, wrapper }) */
private _slotGameObjects;
/** 等待容器就绪的 slot 挂载请求 */
_pendingSlotObjects: {
slot: number | string;
gameObject: GameObject;
options?: {
followAttachmentTimeline?: boolean;
};
}[];
/** 等待执行的动画操作队列 */
private waitExecuteInfos;
/**
* 设置骨架实例
* 当骨架加载完成后自动执行等待队列中的动画操作
*/
set armature(val: any);
/** 获取骨架实例 */
get armature(): any;
/** 组件是否已销毁 */
destroied: boolean;
/** 动画事件处理器 */
addHandler: any;
/** 上一次使用的资源名称 */
lastResource: string;
/**
* 初始化组件
* @param obj - 初始化参数
* @param obj.resource - Spine 资源名称
* @param obj.animationName - 默认动画名称
* @param obj.scale - 缩放比例
* @param obj.autoPlay - 是否自动播放
*/
init(obj?: SpineParams): void;
/** 组件销毁时调用 */
onDestroy(): void;
/**
* 播放指定动画
*
* 如果骨架尚未加载完成,动画操作将被加入等待队列。
*
* @param name - 动画名称,不指定则使用 animationName 属性
* @param loopAnimation - 是否循环播放,默认跟随 autoPlay 属性
* @param track - 动画轨道编号,默认为 0
*/
play(name?: string, loopAnimation?: boolean, track?: number): void;
/**
* 停止指定轨道的动画
*
* 如果骨架尚未加载完成,停止操作将被加入等待队列。
*
* @param track - 动画轨道编号,默认为 0
*/
stop(track?: number): void;
/**
* 在当前动画之后添加新动画到队列
*
* 用于创建动画序列,当前动画播放完毕后自动播放下一个动画。
*
* @param name - 动画名称
* @param delay - 延迟时间(秒)
* @param loop - 是否循环播放
* @param track - 动画轨道编号,默认为 0
*/
addAnimation(name?: string, delay?: number, loop?: boolean, track?: number): void;
/**
* 设置两个动画之间的混合过渡时间
*
* 当从一个动画切换到另一个动画时,会在指定时间内进行平滑过渡。
*
* @param from - 起始动画名称
* @param to - 目标动画名称
* @param duration - 过渡时长(秒)
*/
setMix(from: string, to: string, duration: number): void;
/**
* 获取指定轨道当前播放的动画名称
*
* @param track - 动画轨道编号,默认为 0
* @returns 动画名称,如果未找到则返回 undefined
*/
getAnim(track?: number): any;
/**
* 设置默认的动画混合时间
*
* 当没有为特定动画对指定混合时间时,将使用此默认值。
*
* @param duration - 默认混合时长(秒)
*/
setDefaultMix(duration: number): void;
/**
* 替换指定插槽的附件
*
* 用于换装、武器切换等场景。
*
* @param slotName - 插槽名称
* @param attachmentName - 附件名称
*/
setAttachment(slotName: string, attachmentName: string): void;
/**
* 获取指定名称的骨骼
*
* 可用于直接操作骨骼的位置、旋转、缩放等属性。
*
* @param boneName - 骨骼名称
* @returns 骨骼对象,如果未找到则返回 undefined
*/
getBone(boneName: string): any;
/**
* 将一个 GameObject 挂载到 Spine 的指定插槽上
*
* 挂载后 GameObject 会跟随骨骼运动。当 Spine 组件销毁时,
* 挂载的 GameObject 也会被自动销毁。
*
* @param slot - 插槽名称或索引
* @param gameObject - 要挂载的 GameObject
* @param options - 可选配置
* @param options.followAttachmentTimeline - 是否跟随插槽的附件时间线
*/
addSlotObject(slot: number | string, gameObject: GameObject, options?: {
followAttachmentTimeline?: boolean;
}): void;
private _doAddSlotObject;
/**
* 递归同步 gameObject 及其子树的 transform 到对应的渲染容器
*/
private _syncTransformTree;
/**
* 处理等待容器就绪的 slot 挂载请求(由 SpineSystem 每帧调用)
*/
_flushPendingSlotObjects(): void;
/**
* 从插槽上移除挂载的 GameObject
*
* @param gameObject - 要移除的 GameObject
*/
removeSlotObject(gameObject: GameObject): void;
/**
* 销毁所有挂载到插槽的 GameObject(内部使用)
*/
_destroySlotGameObjects(): void;
}
export declare interface SpineParams {
resource: string;
animationName?: string;
scale?: number;
autoPlay?: boolean;
}
/**
* Spine 骨骼动画系统
*
* SpineSystem 负责管理所有 Spine 组件的骨架创建、动画更新和资源管理。
* 系统会监听 Spine 组件的变化,自动加载骨骼数据并创建动画实例,
* 并在每帧更新所有活跃的 Spine 动画。
*
* 主要功能:
* - 骨骼数据加载和缓存
* - 动画实例创建和销毁
* - 每帧动画状态更新
* - WebGL 上下文恢复处理
* - 资源重试机制
*/
export declare class SpineSystem extends Renderer {
/** 系统名称 */
static systemName: string;
/** 骨架实例映射表(游戏对象 ID -> 骨架容器) */
armatures: Record;
/** Spine 组件实例映射(游戏对象 ID -> Spine 组件) */
private _spineComponents;
/** 渲染系统引用 */
renderSystem: RendererSystem;
/** 渲染器管理器 */
rendererManager: RendererManager;
/** 容器管理器 */
containerManager: ContainerManager;
/** PixiJS Spine 插件实例 */
pixiSpine: any;
/**
* 初始化系统
* @param obj - 初始化参数
* @param obj.pixiSpine - PixiJS Spine 插件实例
*/
init({ pixiSpine }: {
pixiSpine: any;
}): void;
/**
* 每帧更新所有 Spine 动画
* @param e - 更新参数,包含帧间隔时间
*/
update(e: UpdateParams): void;
componentChanged(changed: ComponentChanged): Promise;
add(changed: ComponentChanged, count?: number): Promise;
change(changed: ComponentChanged): void;
remove(changed: ComponentChanged): Promise;
}
export { }