import jgame = junyou.game; class Main extends egret.DisplayObjectContainer { protected currentRender: jgame.AniRender; protected dragDele: junyou.tools.DragDele; protected grid: grid.GridSprite; private cPst: jgame.AniInfo; private dataFile: string; public constructor() { super(); this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this); window["saveCallback"] = this.saveCallback; $(document).ready(() => { $("#btnSave").on("click", this.saveCallback.bind(this)); }); } private saveCallback() { let pst = this.cPst; let frames = pst.frames; let obj = {}; for (let a in frames) { let aInfo = frames[a]; if (aInfo && aInfo.totalFrame) { let m = []; obj[a] = m; let fs = []; m[0] = fs; if (aInfo.isCircle) { m[1] = 1; } let aF = aInfo.frames; let len = aF.length; for (let i = 0; i < len; i++) { let frame = aF[i]; let data: any[] = [+frame.a, +frame.f, +frame.t]; if (frame.e || frame.d != -1) {//一般情况有事件的可能性多余有特定方向的,所以先e,后d data.push(frame.e || 0); if (frame.d != -1) { data.push(+frame.d); } } fs[i] = data; } } } let rawData = pst.rawData; rawData[0][0] = obj; // 将数据写回文件 let require = window["nodeRequire"]; let fs = require("fs"); fs.writeFileSync(this.dataFile, JSON.stringify(rawData)); } private onAddToStage(event: egret.Event) { // 绘制中心线 let sp = new egret.Shape(); let g = sp.graphics; let sw = this.stage.stageWidth; let sh = this.stage.stageHeight; let hh = sh >> 1; let hw = sw >> 1; g.lineStyle(1, 0xff0000); g.moveTo(0, hh); g.lineTo(sw, hh); g.moveTo(hw, 0); g.lineTo(hw, sh); this.grid = new grid.GridSprite(); this.addChild(this.grid); this.dragDele = new junyou.tools.DragDele; this.addChild(this.dragDele); this.addChild(sp); window.addEventListener("dragover", e => { e.preventDefault(); return false }); window.addEventListener("drop", async (e) => { e.preventDefault(); let goted = this.checkFile(e.dataTransfer.files); if (goted) { // 一定是 Electron 环境才能取到值 // 加载数据 let require = window["nodeRequire"]; let path = require("path"); let fs = require("fs"); let str = fs.readFileSync(goted.data, "utf8"); let data = JSON.parse(str); let rawData = JSON.parse(str); let aniRender = new jgame.AniRender(); let pst = new jgame.AniInfo(); this.cPst = pst; // const nativeImage = require('electron').nativeImage; // let nImg = nativeImage.createFromPath(goted.img); // let img = new Image(); // img.src = nImg.toDataURL(); // let bmd = egret.$toBitmapData(img); let bmd = new egret.Bitmap(); await tools.readImageSync(goted.img, bmd); pst.init(goted.key, data, bmd.$bitmapData); pst.rawData = rawData; aniRender._aniInfo = pst; let chkCircle = $("#chkCircle"); chkCircle.removeAttr("disabled"); pst.actionInfo.isCircle ? chkCircle.attr("checked", "checked") : chkCircle.removeAttr("checked"); chkCircle.on("change", (e) => { pst.actionInfo.isCircle = chkCircle[0]["checked"]; }); let dis = new jgame.ResourceBitmap; aniRender.display = dis; dis.res = pst.getResource(); aniRender.play(); this.dragDele.setStartPoint(hw, hh); this.dragDele.aniInfo = pst; this.dataFile = goted.data; this.dragDele.addChild(dis); this.addRender(aniRender); } else { alert("数据不符"); } }); } protected addRender(aniRender: jgame.AniRender) { let old = this.currentRender; if (old) { let dis = old.display; if (dis.parent) { dis.parent.removeChild(dis); } old.onRecycle(); } this.currentRender = aniRender; let pst = aniRender._aniInfo; let dg = $('#dg'); dg["datagrid"]('loadData', pst.frames[0].frames); } /** * 检查文件列表,看是否目录结构一致 * @param files */ private checkFile(files: FileArray, parent: string = "") { // 先检查 pdir中的数据 // let v; // try{ // v = JSON.parse($("#pdir").val()); // } catch(e) { // alert("文件路径规则不是JSON,请检查"); // return; // } // if(!v || !v.image || !v.config){ // alert("没有image或者config节点"); // return; // } // let imgReg = new RegExp(v.image[0]); // let cfgReg = new RegExp(v.config[0]); let path, fs; let require = window["nodeRequire"]; if (typeof require === "function") { //是Electron环境 path = require("path"); fs = require("fs"); } // 必须同时找到 let goted = null; let img = null; let data = null; // 遍历文件,检查文件是否匹配 for (let i = 0, len = files.length; i < len; i++) { let file = files[i]; if (path) { // 如果是Electron环境 let p: string; if (typeof file === "string") { p = path.join(parent, file); } else { // 检查路径 p = file["path"]; } p = p.replace(/\\/g, "/"); let fstats = fs.statSync(p); // 如果是文件夹 if (fstats.isDirectory()) { goted = this.checkFile.call(this, fs.readdirSync(p), p); } else if (fstats.isFile()) {// 检查文件 let re = path.parse(p); if (re.ext == ".png") { img = p; } else if (re.base == "d.json") { data = p; } if (img && data) { // 得到上级目录 let dirs = re.dir.split(path.sep); let key = dirs[dirs.length - 1]; goted = { img: img, data: data, key: key }; } } if (goted) { return goted; } } } return null; } } interface FileArray { length: number; [index: number]: File | string; }