147 lines
5.1 KiB
TypeScript
147 lines
5.1 KiB
TypeScript
import { _decorator, CCInteger, CCString, Component, Node, Sprite, SpriteFrame, Texture2D, UITransform, v2 } from 'cc';
|
|
import { MyAnimation } from './MyAnimation';
|
|
import { GameScript } from '../GameScript/GameScript';
|
|
import { ImagePack } from '../ImagePack/ImagePack';
|
|
import { ScriptAls, ScriptAni } from '../GlobalInterface/GlobalInterface';
|
|
const { ccclass, property, requireComponent } = _decorator;
|
|
|
|
@ccclass('ScriptMyAnimation')
|
|
@requireComponent(Sprite)//依赖组件 精灵
|
|
export class ScriptMyAnimation extends MyAnimation {
|
|
|
|
|
|
@property({ type: CCString, displayName: 'Ani路径', tooltip: "Ani在PVF中的路径" })
|
|
AnimationPath = "";
|
|
|
|
// @property({ type: CCInteger, displayName: '是否显示', tooltip: "1为显示 0为不显示" })
|
|
// PlayState = 0;
|
|
|
|
//是否有替换符
|
|
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;
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
//判断是否有Als
|
|
CheckAnimotionAls() {
|
|
let Ret = GameScript.getInstance().GetDataByPath(this.AnimationPath + ".als");
|
|
if (Ret) {
|
|
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);
|
|
});
|
|
}
|
|
}
|
|
|
|
//通过路径初始化Ani对象
|
|
InitAnimotionObject() {
|
|
this.CheckAnimotionAls();
|
|
this.AniObject = GameScript.getInstance().GetDataByPath(this.AnimationPath);
|
|
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|