118 lines
3.6 KiB
TypeScript
118 lines
3.6 KiB
TypeScript
import AnimatorBase from "./AnimatorBase";
|
||
import AnimatorParams from "./AnimatorParams";
|
||
import AnimatorState from "./AnimatorState";
|
||
|
||
/**
|
||
* 状态机控制类
|
||
*/
|
||
export default class AnimatorController {
|
||
private _jsonData: any = null;
|
||
private _animator: AnimatorBase = null;
|
||
|
||
private _params: AnimatorParams = null;
|
||
private _states: Map<string, AnimatorState> = null;
|
||
private _anyState: AnimatorState = null;
|
||
private _curState: AnimatorState = null;
|
||
|
||
/** 状态切换次数 */
|
||
private _changeCount: number = 0;
|
||
/** 对应animComplete的状态 */
|
||
public animCompleteState: AnimatorState = null;
|
||
/** 动画播放完毕的标记 */
|
||
public animComplete: boolean = false;
|
||
/** 当前运行的状态 */
|
||
public get curState(): AnimatorState { return this._curState; }
|
||
public get params(): AnimatorParams { return this._params; }
|
||
|
||
constructor(player: AnimatorBase, json: any) {
|
||
this._animator = player;
|
||
this._jsonData = json;
|
||
this._states = new Map<string, AnimatorState>();
|
||
this._params = new AnimatorParams(json.parameters);
|
||
this.init(json);
|
||
}
|
||
|
||
/**
|
||
* 初始化状态机所有动画状态
|
||
*/
|
||
private init(json: any) {
|
||
if (json.states.length <= 0) {
|
||
cc.error(`[AnimatorController.init] 状态机json错误`);
|
||
return;
|
||
}
|
||
|
||
let defaultState: string = json.defaultState;
|
||
this._anyState = new AnimatorState(json.anyState, this);
|
||
for (let i = 0; i < json.states.length; i++) {
|
||
let state: AnimatorState = new AnimatorState(json.states[i], this);
|
||
this._states.set(state.name, state);
|
||
}
|
||
this.changeState(defaultState);
|
||
}
|
||
|
||
private updateState() {
|
||
this._curState.checkAndTrans();
|
||
if (this._curState !== this._anyState && this._anyState !== null) {
|
||
this._anyState.checkAndTrans();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 更新状态机逻辑
|
||
*/
|
||
public updateAnimator() {
|
||
// 重置计数
|
||
this._changeCount = 0;
|
||
|
||
this.updateState();
|
||
|
||
// 重置动画完成标记
|
||
if (this.animComplete && this.animCompleteState.loop) {
|
||
this.animComplete = false;
|
||
}
|
||
// 重置autoTrigger
|
||
this.params.resetAllAutoTrigger();
|
||
}
|
||
|
||
public onAnimationComplete() {
|
||
this.animComplete = true;
|
||
this.animCompleteState = this._curState;
|
||
}
|
||
|
||
/**
|
||
* 无视条件直接跳转状态
|
||
* @param 状态名
|
||
*/
|
||
public play(stateName: string) {
|
||
if (!this._states.has(stateName) || this._curState.name === stateName) {
|
||
return;
|
||
}
|
||
|
||
// 重置动画完成标记
|
||
this.animComplete = false;
|
||
this.changeState(stateName);
|
||
}
|
||
|
||
/**
|
||
* 切换动画状态
|
||
*/
|
||
public changeState(stateName: string) {
|
||
this._changeCount++;
|
||
if (this._changeCount > 1000) {
|
||
cc.error('[AnimatorController.changeState] error: 状态切换递归调用超过1000次,transition设置可能出错!');
|
||
return;
|
||
}
|
||
|
||
if (this._states.has(stateName) && (this._curState === null || this._curState.name !== stateName)) {
|
||
let oldState = this._curState;
|
||
this._curState = this._states.get(stateName);
|
||
|
||
this._animator.onStateChange(oldState, this._curState);
|
||
|
||
this.updateState();
|
||
} else {
|
||
cc.error(`[AnimatorController.changeState] error state: ${stateName}`);
|
||
}
|
||
}
|
||
}
|