49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
|
import { animation, AnimationClip, Sprite, SpriteFrame } from 'cc'
|
|||
|
import DataManager from '../Global/DataManager'
|
|||
|
import { ResourceManager } from '../Global/ResourceManager'
|
|||
|
import { sortSpriteFrame } from '../Utils'
|
|||
|
import StateMachine from './StateMachine'
|
|||
|
|
|||
|
/***
|
|||
|
* unit:milisecond
|
|||
|
*/
|
|||
|
export const ANIMATION_SPEED = 1 / 10
|
|||
|
|
|||
|
/***
|
|||
|
* 状态(每组动画的承载容器,持有SpriteAnimation组件执行播放)
|
|||
|
*/
|
|||
|
export default class State {
|
|||
|
private animationClip: AnimationClip
|
|||
|
constructor(
|
|||
|
private fsm: StateMachine,
|
|||
|
private path: string,
|
|||
|
private wrapMode: AnimationClip.WrapMode = AnimationClip.WrapMode.Normal,
|
|||
|
private force: boolean = false,
|
|||
|
) {
|
|||
|
//生成动画轨道属性
|
|||
|
const track = new animation.ObjectTrack()
|
|||
|
track.path = new animation.TrackPath().toComponent(Sprite).toProperty('spriteFrame')
|
|||
|
const spriteFrames = DataManager.Instance.textureMap.get(this.path)
|
|||
|
const frames: Array<[number, SpriteFrame]> = sortSpriteFrame(spriteFrames).map((item, index) => [
|
|||
|
index * ANIMATION_SPEED,
|
|||
|
item,
|
|||
|
])
|
|||
|
track.channel.curve.assignSorted(frames)
|
|||
|
|
|||
|
//动画添加轨道
|
|||
|
this.animationClip = new AnimationClip()
|
|||
|
this.animationClip.name = this.path
|
|||
|
this.animationClip.duration = frames.length * ANIMATION_SPEED
|
|||
|
this.animationClip.addTrack(track)
|
|||
|
this.animationClip.wrapMode = this.wrapMode
|
|||
|
}
|
|||
|
|
|||
|
run() {
|
|||
|
if (this.fsm.animationComponent.defaultClip?.name === this.animationClip.name && !this.force) {
|
|||
|
return
|
|||
|
}
|
|||
|
this.fsm.animationComponent.defaultClip = this.animationClip
|
|||
|
this.fsm.animationComponent.play()
|
|||
|
}
|
|||
|
}
|