1 |
|
2 |
|
3 |
|
4 | class 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 |
|
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,
|
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 |
|
121 | data.frames[name].frame = {
|
122 | x:item.x,
|
123 | y:item.y,
|
124 | w:item.width,
|
125 | h:item.height
|
126 | };
|
127 |
|
128 |
|
129 | data.frames[name].spriteSourceSize = {
|
130 | x:0,
|
131 | y:0,
|
132 | w:item.width,
|
133 | h:item.height
|
134 | };
|
135 |
|
136 |
|
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 |
|
190 | module.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 |