HuaweiDemo/assets/script/core/fighterModel.ts
2023-11-07 09:17:57 +08:00

109 lines
3.4 KiB
TypeScript

import { _decorator, Component, SkeletalAnimationComponent, SkeletalAnimationState, AnimationClip, log } from 'cc';
import { Constant } from '../framework/constant';
import { GobeUtil } from './gobeUtil';
const { ccclass, property } = _decorator;
/**
* Predefined variables
* Name = FighterModel
* DateTime = Tue Sep 07 2021 13:36:57 GMT+0800 (中国标准时间)
* Author = yanli.huang
* FileBasename = FighterModel.ts
* FileBasenameNoExtension = FighterModel
* URL = db://assets/resources/package/prefab/ui/fight/playerModel.ts
* ManualUrl = https://docs.cocos.com/creator/3.3/manual/zh/
*
*/
@ccclass('FighterModel')
export class FighterModel extends Component {
@property(SkeletalAnimationComponent)
public ani: SkeletalAnimationComponent = null!;
public isAniPlaying: boolean = false;//当前动画是否正在播放
//是否正在跑
public get isRunning () {
return this._aniType === Constant.ANI_TYPE.RUN && this.isAniPlaying === true;
}
//是否待机
public get isIdle () {
return this._aniType === Constant.ANI_TYPE.IDLE&& this.isAniPlaying === true;
}
//是否正在攻击
public get isAttacking () {
return this._aniType === Constant.ANI_TYPE.ATTACK && this.isAniPlaying === true;
}
//是否被击中
public get isHitting () {
return this._aniType === Constant.ANI_TYPE.HIT && this.isAniPlaying === true;
}
//是否眩晕
public get isDizzying () {
return this._aniType === Constant.ANI_TYPE.DIZZY && this.isAniPlaying === true;
}
private _aniType: string = "";//动画类型
private _aniState: SkeletalAnimationState = null!;//动画播放状态
public isActick:boolean = false;
/**
* 播放玩家动画
*
* @param {string} aniType 动画类型
* @param {boolean} [isLoop=false] 是否循环
* @param {boolean} [isSkipSameAni=false] 是否跳过同样的动画
* @param {Function} [callback] 回调函数
* @param {number} [callback] 调用播放动画的位置,方便用于测试
* @returns
* @memberof Player
*/
public playAni (aniType: string, isLoop: boolean = false, isSkipSameAni: boolean = false, callback?: Function, pos?: number) {
if(this._aniType == aniType){
return;
}
this._aniState = this.ani?.getState(aniType) as SkeletalAnimationState;
if (this._aniState && this._aniState.isPlaying) {
if (isSkipSameAni) {
this._aniState.time = 0;
this._aniState.sample();
} else {
return;
}
}
this._aniType = aniType;
this.ani?.play(aniType);
this.isAniPlaying = true;
if (this._aniState) {
if (isLoop) {
this._aniState.wrapMode = AnimationClip.WrapMode.Loop;
} else {
this._aniState.wrapMode = AnimationClip.WrapMode.Normal;
}
}
if (!isLoop) {
this.ani.once(SkeletalAnimationComponent.EventType.FINISHED, ()=>{
this.isAniPlaying = false;
callback && callback();
})
}
}
public attackPlayer(){
if(this.isActick){
this.isActick = false;
GobeUtil.instance.sendFrame({'A': Constant.ACTION.IS_ATTACK_ED});
}
}
}