72 lines
2.3 KiB
TypeScript
72 lines
2.3 KiB
TypeScript
|
import AnimatorCondition, { ParamType } from "./AnimatorCondition";
|
|||
|
import AnimatorController from "./AnimatorController";
|
|||
|
|
|||
|
/**
|
|||
|
* 状态过渡类
|
|||
|
*/
|
|||
|
export default class AnimatorTransition {
|
|||
|
private _toStateName: string = '';
|
|||
|
private _hasExitTime: boolean = false;
|
|||
|
private _conditions: AnimatorCondition[] = [];
|
|||
|
private _ac: AnimatorController = null;
|
|||
|
|
|||
|
constructor(data: any, ac: AnimatorController) {
|
|||
|
this._toStateName = data.toState;
|
|||
|
this._hasExitTime = data.hasExitTime;
|
|||
|
this._ac = ac;
|
|||
|
for (let i = 0; i < data.conditions.length; i++) {
|
|||
|
let condition: AnimatorCondition = new AnimatorCondition(data.conditions[i], ac);
|
|||
|
this._conditions.push(condition);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 返回该transition是否有效,当未勾选hasExitTime以及没有添加任何condition时此transition无效并忽略
|
|||
|
*/
|
|||
|
public isValid(): boolean {
|
|||
|
return this._hasExitTime || this._conditions.length > 0;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 判断是否满足所有转换条件
|
|||
|
*/
|
|||
|
public check(): boolean {
|
|||
|
if (this._toStateName === this._ac.curState.name) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (this._hasExitTime && (this._ac.curState !== this._ac.animCompleteState || !this._ac.animComplete)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
for (let i = 0; i < this._conditions.length; i++) {
|
|||
|
if (!this._conditions[i].check()) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 转换状态
|
|||
|
*/
|
|||
|
public doTrans() {
|
|||
|
// 满足条件时重置动画播完标记
|
|||
|
if (this._hasExitTime) {
|
|||
|
this._ac.animComplete = false;
|
|||
|
}
|
|||
|
// 满足状态转换条件时重置trigger和autoTrigger
|
|||
|
for (let i = 0; i < this._conditions.length; i++) {
|
|||
|
let type = this._conditions[i].getParamType();
|
|||
|
let name = this._conditions[i].getParamName();
|
|||
|
if (type === ParamType.TRIGGER) {
|
|||
|
this._ac.params.resetTrigger(name);
|
|||
|
} else if (type === ParamType.AUTO_TRIGGER) {
|
|||
|
this._ac.params.resetAutoTrigger(name);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
this._ac.changeState(this._toStateName);
|
|||
|
}
|
|||
|
}
|