//即使playOnLoad=true,也必須調用play函數播放一個動畫,currentClip屬性才會賦值
let animation=this.getComponent(cc.Animation);
animation.playOnLoad=true;
cc.log(animation.currentClip);//ouput: null
animation.play("idle");
cc.log(animation.currentClip.name);//ouput: idle
//每幀都調用play方法播放一個動畫時,必須判斷要播放的剪輯是否已是當前剪輯,否則會一直播放停止在第一幀
if(animation.currentClip.name!="walk"){
animation.play("walk");
}
let animationState=animation.play("idle");
animationState.time;//動畫播放的時間(注意:播放循環的的動畫剪輯時,播放完成一遍后不會重置0)
偵聽循環的動畫剪輯播放完成
let animation=this.getComponent(cc.Animation);
let animationState=animation.play("idle");
animationState.wrapMode=cc.WrapMode.Loop;
animationState.repeatCount=0;//設置循環的次數,0表示只播放一次(則不需要去設置wrapMode)
animation.on("finished",this.onFinished,this);
//private onFinished():void{}
動態修改AnimationClip.speed,AnimationSate.speed,duration不會更新
animState.speed=2;//動態修改時不會受到影響animState.duration,animState.clip.duration
animState.clip.speed=2;//動態修改時不會受到影響animState.duration,animState.clip.duration
在指定幀停止
let animState=this._animation.play("num");
animState.speed=0;
let frameNO=3;//停止的幀編號
let frameTime:number=animState.clip.curveData['comps']['cc.Sprite']['spriteFrame'][frameNO-1].frame;
this._animation.setCurrentTime(frameTime);
//完整指定幀停止的函數:
/**
* 播放動畫到指定的sprite幀,並停止
* @param animation cc.Animation組件
* @param frameNO 幀編號(大於0的整數)
* @param clipName 不填寫時播放默認動畫剪輯
*/
public static gotoAndStop(animation:cc.Animation,frameNO:number,clipName?:string):void{
let frameNO_int=frameNO|0;
if(frameNO_int!==frameNO||frameNO<1){
frameNO=Math.max(frameNO_int,1);
cc.warn("參數 frameNO 應傳入正整數");
}
let animState=animation.play(clipName);
const speedRecord=animState.speed;
animState.speed=0;
let spriteFrameDatas:any[]=animState.clip.curveData['comps']['cc.Sprite']['spriteFrame'];
frameNO=Math.min(frameNO,spriteFrameDatas.length);
let frameTime:number=spriteFrameDatas[frameNO-1].frame;
animation.setCurrentTime(frameTime);
animState.stop();
animState.speed=speedRecord;
}