226 lines
7.5 KiB
TypeScript
226 lines
7.5 KiB
TypeScript
|
||
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;
|
||
} |