2022-11-27 23:23:47 +08:00

59 lines
2.0 KiB
TypeScript

import { _decorator, Animation, AnimationClip } from 'cc'
import State from '../../Base/State'
import StateMachine, { getInitParamsNumber, getInitParamsTrigger } from '../../Base/StateMachine'
import { EntityStateEnum, EntityTypeEnum, ParamsNameEnum } from '../../Enum'
import { WeaponManager } from './WeaponManager'
const { ccclass, property } = _decorator
@ccclass('WeaponStateMachine')
export class WeaponStateMachine extends StateMachine {
type: EntityTypeEnum
init(type: EntityTypeEnum) {
this.type = type
this.animationComponent = this.node.addComponent(Animation)
this.initParams()
this.initStateMachines()
this.initAnimationEvent()
}
initParams() {
this.params.set(ParamsNameEnum.Idle, getInitParamsTrigger())
this.params.set(ParamsNameEnum.Attack, getInitParamsTrigger())
}
initStateMachines() {
this.stateMachines.set(ParamsNameEnum.Idle, new State(this, `${this.type}${EntityStateEnum.Idle}`))
this.stateMachines.set(ParamsNameEnum.Attack, new State(this, `${this.type}${EntityStateEnum.Attack}`, AnimationClip.WrapMode.Normal, true))
}
initAnimationEvent() {
this.animationComponent.on(Animation.EventType.FINISHED, () => {
const whiteList = [EntityStateEnum.Attack]
const name = this.animationComponent.defaultClip.name
if (whiteList.some(v => name.includes(v))) {
this.node.parent.getComponent(WeaponManager).state = EntityStateEnum.Idle
}
})
}
run() {
switch (this.currentState) {
case this.stateMachines.get(ParamsNameEnum.Idle):
case this.stateMachines.get(ParamsNameEnum.Attack):
if (this.params.get(ParamsNameEnum.Attack).value) {
this.currentState = this.stateMachines.get(ParamsNameEnum.Attack)
} if (this.params.get(ParamsNameEnum.Idle).value) {
this.currentState = this.stateMachines.get(ParamsNameEnum.Idle)
} else {
this.currentState = this.currentState
}
break
default:
this.currentState = this.stateMachines.get(ParamsNameEnum.Idle)
break
}
}
}