210 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| /*
 | |
| 文件名:AnimationClass.nut
 | |
| 路径:Core/BaseClass/AnimationClass/AnimationClass.nut
 | |
| 创建日期:2024-05-07	23:25
 | |
| 文件用途:动画类
 | |
| */
 | |
| class Animation extends Actor {
 | |
| 
 | |
|     //Ani是否可用
 | |
|     IsUsability = true;
 | |
| 
 | |
|     //当前帧数
 | |
|     CurrentFrameIndex = 0;
 | |
|     //当前帧时间
 | |
|     CurrentIndexT = 0;
 | |
|     //当前帧
 | |
|     CurrentFrame = null;
 | |
|     //状态机对象(只有存在时才有KeyFlag)
 | |
|     StateMachine = null;
 | |
| 
 | |
|     //Ani的标签
 | |
|     AnimationFlag = null;
 | |
|     //帧对象数组
 | |
|     FrameArr = null;
 | |
|     //图片精灵帧对象
 | |
|     SpriteArr = null;
 | |
| 
 | |
|     //Ani类型
 | |
|     Type = "normal";
 | |
| 
 | |
|     //附加选项
 | |
|     AdditionalOptions = null;
 | |
| 
 | |
|     constructor(...) {
 | |
|         //精灵帧数组
 | |
|         SpriteArr = [];
 | |
|         //帧数组
 | |
|         FrameArr = [];
 | |
|         base.constructor();
 | |
| 
 | |
|         //判断是否有特殊处理
 | |
|         if (vargv.len() > 1) {
 | |
|             AdditionalOptions = vargv[1];
 | |
|         }
 | |
|         //初始化数据
 | |
|         InitData(vargv[0]);
 | |
|     }
 | |
| 
 | |
|     function InitData(Data) {
 | |
|         local Buf;
 | |
|         if (type(Data) == "table") {
 | |
|             Buf = Data;
 | |
|         }
 | |
|         //从PVF数据加载
 | |
|         else if (type(Data) == "string") {
 | |
|             Data = String.RegRealPath(Data);
 | |
|             Buf = sq_DeepCopy(ScriptData.GetAni(Data));
 | |
|             //还需要判断一下有没有als
 | |
|             local AlsBuf = ScriptData.GetFile(Data + ".als");
 | |
|             if (AlsBuf) {
 | |
|                 local m_data = ScriptData.GetFileData(Data + ".als", function(DataTable, Data) {
 | |
|                     local Anilist = {};
 | |
|                     while (!Data.Eof()) {
 | |
|                         local Pack = Data.Get();
 | |
|                         if (Pack == "[use animation]") {
 | |
|                             local AniPath = Data.Get();
 | |
|                             local AniKey = Data.Get();
 | |
|                             if (!(AniKey in Anilist))
 | |
|                                 Anilist[AniKey] <- {};
 | |
|                             Anilist[AniKey].path <- AniPath;
 | |
|                         } else if (Pack == "[none effect add]") {
 | |
|                             local AniLayer = [Data.Get(), Data.Get()];
 | |
|                             local AniKey = Data.Get();
 | |
|                             if (!(AniKey in Anilist))
 | |
|                                 Anilist[AniKey] <- {};
 | |
|                             Anilist[AniKey].layer <- AniLayer;
 | |
|                         } else if (Pack == "[add]") {
 | |
|                             local AniLayer = [Data.Get(), Data.Get()];
 | |
|                             local AniKey = Data.Get();
 | |
|                             if (!(AniKey in Anilist))
 | |
|                                 Anilist[AniKey] <- {};
 | |
|                             Anilist[AniKey].layer <- AniLayer;
 | |
|                         }
 | |
|                     }
 | |
|                     DataTable.Anilist <- Anilist;
 | |
|                     DataTable.dirpath <- DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1);
 | |
|                 });
 | |
|                 foreach(Index, Info in m_data.Anilist) {
 | |
|                     local anibuf = Animation(m_data.dirpath + Info.path.tolower());
 | |
|                     anibuf.SetZOrder(Info.layer[1]);
 | |
|                     Addchild(anibuf);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if (Buf) {
 | |
|             AnimationFlag = Buf.Flag;
 | |
|             FrameArr = Buf.Frame;
 | |
|             foreach(FrameObj in FrameArr) {
 | |
|                 //如果有附加处理 格式化
 | |
|                 if (AdditionalOptions && AdditionalOptions.rawin("ImgFormat")) FrameObj.Img_Path = AdditionalOptions["ImgFormat"](FrameObj.Img_Path);
 | |
| 
 | |
|                 local SpriteFramebuf = CL_SpriteFrameObject("sprite/" + FrameObj.Img_Path, FrameObj.Img_Index);
 | |
|                 local Spritebuf = CL_SpriteObject();
 | |
|                 Spritebuf.SetFrame(SpriteFramebuf);
 | |
| 
 | |
|                 //线性减淡
 | |
|                 if ("GRAPHIC_EFFECT_LINEARDODGE" in FrameObj.Flag) {
 | |
|                     Spritebuf.SetMode(0);
 | |
|                 }
 | |
| 
 | |
|                 //坐标
 | |
|                 Spritebuf.SetPosition(FrameObj.Pos);
 | |
| 
 | |
| 
 | |
| 
 | |
|                 SpriteArr.append(Spritebuf);
 | |
|             }
 | |
|         } else {
 | |
|             error("创建Ani失败,找不到Ani数据");
 | |
|         }
 | |
| 
 | |
|         //初始化完毕设置大小为第0帧大小否则天空 地板等依靠大小的初始化会有问题
 | |
|         SetSize(SpriteArr[0].GetSize());
 | |
|     }
 | |
| 
 | |
|     //被添加时  要刷新一下当前帧
 | |
|     function OnAddchild(Parent) {
 | |
|         FlushFrame(0);
 | |
|     }
 | |
| 
 | |
|     //重置Ani
 | |
|     function Reset() {
 | |
|         IsUsability = true;
 | |
|         FlushFrame(0);
 | |
|     }
 | |
| 
 | |
|     //赋予状态机
 | |
|     function BindenvStateMachine(gM) {
 | |
|         StateMachine = gM;
 | |
|     }
 | |
| 
 | |
|     //获取当前帧信息
 | |
|     function GetCurrentFrameInfo() {
 | |
|         return FrameArr[CurrentFrameIndex];
 | |
|     }
 | |
| 
 | |
|     function FlushFrame(Index) {
 | |
|         //同步当前帧
 | |
|         CurrentFrameIndex = Index;
 | |
|         //移除上一帧
 | |
|         if (CurrentFrame) Removechild(CurrentFrame);
 | |
|         //当前帧更换为本帧
 | |
|         CurrentFrame = SpriteArr[CurrentFrameIndex];
 | |
|         Addchild(SpriteArr[CurrentFrameIndex]);
 | |
| 
 | |
|         local FlagBuf = FrameArr[CurrentFrameIndex].Flag;
 | |
|         //关键帧
 | |
|         if ("SET_FLAG" in FlagBuf) {
 | |
|             if (StateMachine && StateMachine.State != -1) StateMachine.ChangeAniKeyFlag(FlagBuf.SET_FLAG);
 | |
|         }
 | |
|         //播放音效
 | |
|         if ("PLAY_SOUND" in FlagBuf) {
 | |
|             Sq_PlaySoundEffect(FlagBuf.PLAY_SOUND);
 | |
|         }
 | |
|         //缩放
 | |
|         if ("IMAGE_RATE" in FlagBuf) {
 | |
|             SetScale(FlagBuf.IMAGE_RATE.x, FlagBuf.IMAGE_RATE.y);
 | |
|         }
 | |
| 
 | |
|         //Ani对象的大小同步为精灵帧对象的大小
 | |
|         if (CurrentFrame) SetSize(CurrentFrame.GetSize());
 | |
|     }
 | |
| 
 | |
|     //override
 | |
|     function OnUpdate(dt) {
 | |
| 
 | |
|         //可用性检查
 | |
|         if (IsUsability) {
 | |
|             //累加当前帧时间
 | |
|             CurrentIndexT += dt;
 | |
| 
 | |
|             //当前帧时间 超过 当前帧延迟就需要切换帧了
 | |
|             if (CurrentIndexT >= FrameArr[CurrentFrameIndex].Delay) {
 | |
|                 CurrentIndexT = 0;
 | |
|                 //如果当前帧小于总帧数就切换
 | |
|                 if (CurrentFrameIndex<(FrameArr.len() - 1)) {
 | |
|                     FlushFrame(CurrentFrameIndex + 1);
 | |
|                 }
 | |
|                 //说明播放完毕了
 | |
|                 else {
 | |
|                     //如果有循环
 | |
|                     if ("LOOP" in AnimationFlag) {
 | |
|                         FlushFrame(0);
 | |
|                     }
 | |
|                     //没有循环触发状态机回调
 | |
|                     else {
 | |
|                         //将不再可用
 | |
|                         IsUsability = false;
 | |
|                         if (StateMachine && StateMachine.State != -1) StateMachine.ChangeAniEndFlag();
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
|         }
 | |
| 
 | |
|         base.OnUpdate(dt);
 | |
|     }
 | |
| } |