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); | ||
|  |     } | ||
|  | } |