DaFuWeng/assets/GlobalScript/Animation/MyAnimation.ts

174 lines
5.5 KiB
TypeScript
Raw Normal View History

2024-03-06 22:06:49 +08:00
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) {
2024-03-06 22:06:49 +08:00
//如果游戏世界处于暂停的模式下 不再继续播放
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);
2024-03-06 22:06:49 +08:00
//重置计时器
this.PlayTimer = 0;
}
}
this.PlayTimer += deltaTime * 1000;
}
}