174 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| import {
 | |
|     _decorator, Component, math, Node, resources, Sprite, SpriteFrame, Texture2D, UITransform, v2, v3, Vec2, Vec3,
 | |
| } from "cc";
 | |
| import { GameState } from "../GlobalGameState/GameState";
 | |
| import { ImagePack } from "../ImagePack/ImagePack";
 | |
| import { Ani_Frame, Img, ScriptAni } from "../GlobalInterface/GlobalInterface";
 | |
| import { GameScript } from "../GameScript/GameScript";
 | |
| const { ccclass, property, requireComponent } = _decorator;
 | |
| 
 | |
| 
 | |
| @ccclass("MyAnimation")
 | |
| @requireComponent(Sprite)
 | |
| export class MyAnimation extends Component {
 | |
|     //Ani加载精灵帧初始化状态
 | |
|     InitState: boolean = false;
 | |
| 
 | |
|     SpriteObj: Sprite = null;
 | |
| 
 | |
|     //Ani帧数
 | |
|     AnimationFrameCount: number = 1;
 | |
| 
 | |
|     //默认img路径
 | |
|     DefaultImgPath: string = "";
 | |
| 
 | |
|     //img路径的数组
 | |
|     ImgPath: string[] = Array<string>();
 | |
|     ImgIndex: number[] = Array<number>();
 | |
|     //img帧的数组
 | |
|     FrameArr: Array<Ani_Frame> = [];
 | |
| 
 | |
|     //实际用到的Img路径数组 可能用于以后的释放NPK
 | |
|     RealUseImgPath: string[] = Array<string>();
 | |
| 
 | |
|     //播放计时器时间
 | |
|     PlayTimer: number = 0;
 | |
| 
 | |
|     //每帧延迟时间
 | |
|     FrameDelay: number[] = Array<number>();
 | |
| 
 | |
|     //当前帧
 | |
|     NowFrame: number = 0;
 | |
| 
 | |
| 
 | |
|     //Ani播放状态 0未播放 1播放中 2暂停中 3播放完成
 | |
|     PlayState = 0;
 | |
| 
 | |
|     //Ani对象
 | |
|     AniObject: ScriptAni;
 | |
| 
 | |
| 
 | |
|     //初始化路径
 | |
|     InitPath() {
 | |
|         //首先push默认路径
 | |
|         this.RealUseImgPath.push(this.DefaultImgPath);
 | |
| 
 | |
|         //遍历img路径数组
 | |
|         this.ImgPath.forEach((Path, index) => {
 | |
|             //如果没填写说明为空
 | |
|             if (Path == "") {
 | |
|                 Path = this.DefaultImgPath;
 | |
|             } else {
 | |
|                 if (!this.RealUseImgPath.includes(Path)) {
 | |
|                     this.RealUseImgPath.push(Path);
 | |
|                 }
 | |
|             }
 | |
|             this.FrameArr.push({
 | |
|                 Img_Path: Path,
 | |
|                 Img_Index: this.ImgIndex[index],
 | |
|                 Delay: this.FrameDelay[index],
 | |
|                 Frame: null,
 | |
|             });
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     LoadSuccessImgCount: number = 0;
 | |
|     ImgTable: Map<string, Img> = new Map<string, Img>();
 | |
|     //读取Img
 | |
|     InitImg() {
 | |
|         //遍历img路径数组
 | |
|         this.RealUseImgPath.forEach((Path, index) => {
 | |
|             ImagePack.getInstance().ReadNpkTable(Path, (ImgObj) => {
 | |
|                 this.LoadSuccessImgCount++;
 | |
|                 //记录路径对应的Img对象
 | |
|                 this.ImgTable.set(Path, ImgObj);
 | |
|                 //如果已加载数量等于总数量 说明Img初始化完成
 | |
|                 if (this.LoadSuccessImgCount == this.RealUseImgPath.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, 0);
 | |
|                         // 更新 0 级 Mipmap。
 | |
|                         tex.updateImage();
 | |
|                         spriteFrame.texture = tex;
 | |
|                         spriteFrame.offset = v2(Png.Xpos, -Png.Ypos);
 | |
| 
 | |
|                         this.FrameArr[Index].Frame = spriteFrame;
 | |
|                     });
 | |
|                     this.InitState = true;
 | |
|                 }
 | |
|             });
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     Init() {
 | |
|         this.InitPath();
 | |
| 
 | |
|         this.InitImg();
 | |
|     }
 | |
| 
 | |
|     start() {
 | |
|         //判断是否有精灵 如果没有 就给他搞一个
 | |
|         if (this.node.getComponent(Sprite))
 | |
|             this.SpriteObj = this.node.getComponent(Sprite);
 | |
|         else
 | |
|             this.SpriteObj = this.node.addComponent(Sprite);
 | |
| 
 | |
| 
 | |
|         //初始化构造内容
 | |
|         this.Init();
 | |
| 
 | |
|         //设置节点锚点为左上角
 | |
|         this.node.getComponent(UITransform).anchorPoint = v2(0, 1);
 | |
|         //设置类型
 | |
|         this.SpriteObj.sizeMode = Sprite.SizeMode.RAW;
 | |
|         //设置
 | |
|         this.SpriteObj.trim = false;
 | |
|     }
 | |
| 
 | |
|     update(deltaTime: number) {
 | |
| 
 | |
|         //如果游戏世界处于暂停的模式下 不再继续播放
 | |
|         if (GameState.getInstance().IsPauseState()) return;
 | |
|         //如果初始化未完成,不播放
 | |
|         if (!this.InitState) return;
 | |
|         //如果不在播放中
 | |
|         if (this.PlayState != 1) return;
 | |
| 
 | |
|         let FrameObj = this.FrameArr[this.NowFrame];
 | |
|         if (FrameObj) {
 | |
|             //当前帧播放时间大于本帧延迟时间时
 | |
|             if (this.PlayTimer > FrameObj.Delay) {
 | |
|                 //帧数加1
 | |
|                 this.NowFrame++;
 | |
|                 //Ani播放完了
 | |
|                 if (this.NowFrame >= this.FrameArr.length) {
 | |
|                     if (this.AniObject && this.AniObject.Flag && this.AniObject.Flag.get("LOOP"))
 | |
|                         this.NowFrame = 0;
 | |
|                     else this.PlayState = 3;
 | |
|                 }
 | |
| 
 | |
|                 //设置精灵对象更换图片
 | |
|                 this.SpriteObj.spriteFrame = FrameObj.Frame;
 | |
|                 // console.log(this.node);
 | |
| 
 | |
|                 //设置坐标
 | |
|                 if (FrameObj.Pos) this.node.setPosition(FrameObj.Pos);
 | |
| 
 | |
|                 //重置计时器
 | |
|                 this.PlayTimer = 0;
 | |
|             }
 | |
|         }
 | |
|         this.PlayTimer += deltaTime * 1000;
 | |
|     }
 | |
| }
 |