EffectTools/src/Main.ts
2020-08-21 11:10:39 +08:00

226 lines
7.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, <string>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;
}