UNPKG

6.58 kBJavaScriptView Raw
1/**
2 * 生成Pixi.js支持的sprite
3 */
4class PixiSprite{
5 constructor(name,options){
6 const _ts = this;
7
8 //自定义模块
9 _ts.m = {
10 path:require('path'),
11 fs:require('fs'),
12 spritesmith:require('spritesmith'),
13 getPathInfo:require('../lib/getPathInfo'),
14 tip:require('../lib/tip')
15 };
16
17 _ts.name = name;
18 _ts.option = options;
19
20 _ts.srcPath = _ts.name ? _ts.m.path.join(fws.cmdPath,_ts.name) : fws.cmdPath;
21 }
22
23 init(){
24 const _ts = this,
25 m = _ts.m;
26
27 let srcPath = _ts.srcPath;
28 _ts.outData(srcPath).then(v => {
29 let outDir = m.path.join(srcPath,'../'),
30 sjson = (()=>{
31 let json;
32 //如果开启格式化选项,则模式化json文件
33 if(_ts.option.format){
34 json = JSON.stringify(v.data.json,null,2);
35 }else{
36 json = JSON.stringify(v.data.json);
37 };
38 return json;
39 })();
40
41 try {
42 let jsonPath = m.path.join(outDir,v.data.name+'.json'),
43 imgPath = m.path.join(outDir,v.data.name+'.png');
44
45 m.fs.writeFileSync(jsonPath,sjson);
46 m.tip.success(`${jsonPath} 生成成功`);
47 m.fs.writeFileSync(imgPath,v.data.image);
48 m.tip.success(`${imgPath} 生成成功`);
49
50 } catch (error) {
51 m.tip.error(error);
52 }
53 }).catch(e => {
54 m.tip.error(e.msg);
55 });
56
57 }
58
59 //输出数据
60 outData(srcDirPath){
61 const _ts = this,
62 m = _ts.m;
63
64 return new Promise((resolve,reject)=>{
65 if(m.getPathInfo(srcDirPath).type !== 'dir'){
66 reject({
67 status:'error',
68 msg:`${srcDirPath} 不是有效的目录`
69 });
70 return;
71 };
72
73 let data = {
74 frames:{},
75 meta:{}
76 },
77 imgsPath = _ts.getImgsPath(),
78 option = {
79 src:imgsPath,
80 padding:4,
81 algorithm:'binary-tree'
82 };
83
84 //如果配置中有声明图像处理引擎,则传入引擎到配置中
85 if(fws.config.imgEngine !== '' && typeof fws.config.imgEngine === 'string'){
86 option.engine = require(fws.config.imgEngine);
87 };
88
89 //当目录内无图片时则不继续执行
90 if(imgsPath.length === 0){
91 reject({
92 status:'error',
93 msg:`${srcDirPath} 无可合并的图片文件`
94 });
95 return;
96 };
97
98 m.spritesmith.run(option,(err,result)=>{
99 if(err){
100 reject({
101 status:'error',
102 msg:`${srcDirPath} 图片合成遇到错误`,
103 data:err
104 });
105 }else{
106 let imgs = result.coordinates, //精灵信息
107 size = result.properties, //总的大小
108 img = result.image, //图片buffer
109 filename = (()=>{
110 let dirs = srcDirPath.split(m.path.sep);
111 return dirs[dirs.length - 1];
112 })();
113
114 for(let i in imgs){
115 let name = m.path.basename(i),
116 item = imgs[i];
117
118 data.frames[name] = {};
119
120 //frame
121 data.frames[name].frame = {
122 x:item.x,
123 y:item.y,
124 w:item.width,
125 h:item.height
126 };
127
128 //spriteSourceSize
129 data.frames[name].spriteSourceSize = {
130 x:0,
131 y:0,
132 w:item.width,
133 h:item.height
134 };
135
136 //sourceSize
137 data.frames[name].sourceSize = {
138 w:item.width,
139 h:item.height
140 };
141 };
142
143 data.meta.app = 'https://github.com/sbfkcel/fws';
144 data.meta.image = `${filename}.png`;
145 data.meta.size = {
146 w:size.width,
147 h:size.height
148 };
149 data.meta.scale = '1';
150
151 resolve({
152 status:'success',
153 msg:'合并成功',
154 data:{
155 json:data,
156 image:img,
157 name:filename
158 }
159 });
160 };
161 });
162 })
163 }
164
165 //获取目录内所有图片
166 getImgsPath(){
167 const _ts = this,
168 m = _ts.m;
169
170 let imgs = [],
171 dirPath = _ts.srcPath,
172 files = m.fs.readdirSync(dirPath),
173 filesPath = (()=>{
174 files.forEach(item => {
175 let filePath = m.path.join(dirPath,item),
176 extname = m.path.extname(filePath).toLocaleLowerCase(),
177 isImg = ['jpg','jpeg','png'].some(item => {
178 return extname === '.'+item;
179 });
180 if(isImg){
181 imgs.push(filePath);
182 };
183 });
184 })();
185
186 return imgs;
187 }
188}
189
190module.exports = {
191 regTask:{
192 command:'[name]',
193 description:'从指定目录创建PixiSprite',
194 option:[
195 ['-f, --format','格式化输出的 JSON 文件']
196 ],
197 help:()=>{
198 console.log('');
199 console.log(' 补充说明:');
200 console.log(' ------------------------------------------------------------');
201 console.log(' 暂无');
202 },
203 action:PixiSprite
204 },
205 fun:()=>{}
206};
\No newline at end of file