| 
									
										
										
										
											2024-03-09 13:19:32 +08:00
										 |  |  | import { _decorator, CCInteger, CCString, Component, Node, Sprite, SpriteFrame, Texture2D, UITransform, v2 } from 'cc'; | 
					
						
							| 
									
										
										
										
											2024-03-06 22:06:49 +08:00
										 |  |  | import { MyAnimation } from './MyAnimation'; | 
					
						
							|  |  |  | import { GameScript } from '../GameScript/GameScript'; | 
					
						
							|  |  |  | import { ImagePack } from '../ImagePack/ImagePack'; | 
					
						
							| 
									
										
										
										
											2024-03-09 13:19:32 +08:00
										 |  |  | import { ScriptAls, ScriptAni } from '../GlobalInterface/GlobalInterface'; | 
					
						
							| 
									
										
										
										
											2024-03-06 22:06:49 +08:00
										 |  |  | const { ccclass, property, requireComponent } = _decorator; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @ccclass('ScriptMyAnimation') | 
					
						
							|  |  |  | @requireComponent(Sprite)//依赖组件 精灵
 | 
					
						
							|  |  |  | export class ScriptMyAnimation extends MyAnimation { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property({ type: CCString, displayName: 'Ani路径', tooltip: "Ani在PVF中的路径" }) | 
					
						
							| 
									
										
										
										
											2024-03-09 13:19:32 +08:00
										 |  |  |     AnimationPath = ""; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // @property({ type: CCInteger, displayName: '是否显示', tooltip: "1为显示 0为不显示" })
 | 
					
						
							|  |  |  |     // PlayState = 0;
 | 
					
						
							| 
									
										
										
										
											2024-03-06 22:06:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     //是否有替换符
 | 
					
						
							|  |  |  |     Replace: Array<string>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //读取Img
 | 
					
						
							|  |  |  |     InitImg() { | 
					
						
							|  |  |  |         //遍历img路径数组
 | 
					
						
							|  |  |  |         this.AniObject.Img_List.forEach((Path, index) => { | 
					
						
							|  |  |  |             ImagePack.getInstance().ReadNpkTable("sprite/" + Path.toLocaleLowerCase(), (ImgObj) => { | 
					
						
							|  |  |  |                 this.LoadSuccessImgCount++; | 
					
						
							|  |  |  |                 //记录路径对应的Img对象
 | 
					
						
							|  |  |  |                 this.ImgTable.set(Path, ImgObj); | 
					
						
							|  |  |  |                 //如果已加载数量等于总数量 说明Img初始化完成
 | 
					
						
							|  |  |  |                 if (this.LoadSuccessImgCount == this.AniObject.Img_List.length) { | 
					
						
							|  |  |  |                     //都加载完成以后 把精灵帧初始化出来
 | 
					
						
							|  |  |  |                     this.FrameArr.forEach((FrameObj, Index) => { | 
					
						
							|  |  |  |                         const Png = this.ImgTable.get(FrameObj.Img_Path).Png_List[FrameObj.Img_Index]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         let spriteFrame = new SpriteFrame(); | 
					
						
							|  |  |  |                         let tex = new Texture2D(); | 
					
						
							|  |  |  |                         tex.reset({ | 
					
						
							|  |  |  |                             width: Png.Width, | 
					
						
							|  |  |  |                             height: Png.Height, | 
					
						
							|  |  |  |                             format: Texture2D.PixelFormat.RGBA8888, | 
					
						
							|  |  |  |                             mipmapLevel: 0, | 
					
						
							|  |  |  |                         }); | 
					
						
							|  |  |  |                         tex.uploadData(Png.PNGdata); | 
					
						
							|  |  |  |                         // 更新 0 级 Mipmap。
 | 
					
						
							|  |  |  |                         tex.updateImage(); | 
					
						
							|  |  |  |                         spriteFrame.texture = tex; | 
					
						
							|  |  |  |                         spriteFrame.offset = v2(Png.Xpos, -Png.Ypos); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         this.FrameArr[Index].Frame = spriteFrame; | 
					
						
							|  |  |  |                     }); | 
					
						
							|  |  |  |                     this.InitState = true; | 
					
						
							|  |  |  |                     //开始播放
 | 
					
						
							|  |  |  |                     this.PlayState = 1; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-09 13:19:32 +08:00
										 |  |  |     Decompile_als(str: string) { | 
					
						
							|  |  |  |         const strbuf = str.split("\n"); | 
					
						
							|  |  |  |         let Flag = 0; | 
					
						
							|  |  |  |         let AniobjArr: Array<string> = new Array<string>; | 
					
						
							|  |  |  |         let AniaddArr: Array<string[]> = new Array<string[]>; | 
					
						
							|  |  |  |         strbuf.forEach((lstr, line) => { | 
					
						
							|  |  |  |             if (Flag == 0) { | 
					
						
							|  |  |  |                 if (lstr.indexOf("[use animation]") != -1) { | 
					
						
							|  |  |  |                     Flag = 1; | 
					
						
							|  |  |  |                 } else if (lstr.indexOf("[none effect add]") != -1 || lstr.indexOf("[add]") != -1) { | 
					
						
							|  |  |  |                     Flag = 5; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } else if (Flag == 1) { | 
					
						
							|  |  |  |                 AniobjArr.push(lstr); | 
					
						
							|  |  |  |                 Flag = 2; | 
					
						
							|  |  |  |             } else if (Flag == 2) { | 
					
						
							|  |  |  |                 AniobjArr.push(lstr); | 
					
						
							|  |  |  |                 Flag = 0; | 
					
						
							|  |  |  |             } else if (Flag == 5) { | 
					
						
							|  |  |  |                 let buf = lstr.split("\t"); | 
					
						
							|  |  |  |                 AniaddArr.push(buf); | 
					
						
							|  |  |  |                 Flag = 0; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let AniArr: Array<ScriptAls> = new Array<ScriptAls>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (let index = 0; index < AniobjArr.length; index += 2) { | 
					
						
							|  |  |  |             let ScriptAlsBuf: ScriptAls = {}; | 
					
						
							|  |  |  |             ScriptAlsBuf.Path = AniobjArr[index]; | 
					
						
							|  |  |  |             ScriptAlsBuf.Name = AniobjArr[index + 1]; | 
					
						
							|  |  |  |             AniArr.push(ScriptAlsBuf); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // console.log(AniobjArr);
 | 
					
						
							|  |  |  |         // console.log(AniaddArr);
 | 
					
						
							|  |  |  |         return AniArr; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-07 13:37:44 +08:00
										 |  |  |     //判断是否有Als
 | 
					
						
							|  |  |  |     CheckAnimotionAls() { | 
					
						
							| 
									
										
										
										
											2024-03-09 13:19:32 +08:00
										 |  |  |         let Ret = GameScript.getInstance().GetDataByPath(this.AnimationPath + ".als"); | 
					
						
							| 
									
										
										
										
											2024-03-07 13:37:44 +08:00
										 |  |  |         if (Ret) { | 
					
						
							| 
									
										
										
										
											2024-03-09 13:19:32 +08:00
										 |  |  |             let Als = this.Decompile_als(Ret); | 
					
						
							|  |  |  |             Als.forEach(aniobj => { | 
					
						
							|  |  |  |                 let NodeBuf = new Node(); | 
					
						
							|  |  |  |                 // let SpriteBuf = NodeBuf.addComponent(Sprite);
 | 
					
						
							|  |  |  |                 let Ani = NodeBuf.addComponent(ScriptMyAnimation); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 Ani.AnimationPath = this.AnimationPath.substring(0, this.AnimationPath.lastIndexOf("/") + 1) + aniobj.Path.match(/`(.*?)`/)[1].toLowerCase(); | 
					
						
							|  |  |  |                 // Ani.PlayState = this.PlayState;
 | 
					
						
							|  |  |  |                 // console.log(Ani.AnimationPath);
 | 
					
						
							|  |  |  |                 this.node.parent.addChild(NodeBuf); | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2024-03-07 13:37:44 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 22:06:49 +08:00
										 |  |  |     //通过路径初始化Ani对象
 | 
					
						
							|  |  |  |     InitAnimotionObject() { | 
					
						
							| 
									
										
										
										
											2024-03-07 13:37:44 +08:00
										 |  |  |         this.CheckAnimotionAls(); | 
					
						
							| 
									
										
										
										
											2024-03-06 22:06:49 +08:00
										 |  |  |         this.AniObject = GameScript.getInstance().GetDataByPath(this.AnimationPath); | 
					
						
							| 
									
										
										
										
											2024-03-07 13:37:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 22:06:49 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Init() { | 
					
						
							|  |  |  |         if (!this.AniObject) this.InitAnimotionObject(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //如果有替换符则替换
 | 
					
						
							|  |  |  |         if (this.Replace) { | 
					
						
							|  |  |  |             this.AniObject.Frame.forEach((FrameObj, Index) => { | 
					
						
							|  |  |  |                 this.AniObject.Frame[Index].Img_Path = FrameObj.Img_Path.replace(this.Replace[0], this.Replace[1]); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         this.FrameArr = this.AniObject.Frame; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         this.InitImg(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     start() { | 
					
						
							|  |  |  |         super.start(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |