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