Nieyt's Blog

将帧序列雪碧图数据转化为egret MovieClip可应用的动画数据

字数统计: 586阅读时长: 2 min
2019/03/25 Share

我们知道Egret工具集中的Texture Merger,可将零散纹理拼合为整图,同时也可以解析SWF、GIF动画,导出可供Egret使用的配置文件。但是,在项目应用中,我们遇到了一些问题。由于设计师提供的gif图无法去除锯齿或白边,要想有比较完美的画质,只能提供动图的每一帧的png序列。虽然Texture Merger并没有将静态序列图转换为MovieClip可应用的动画文件的配置项,但我们可以先将png图片合成为雪碧图,通过观察动画数据的配置规则,我们可将雪碧图的json配置文件转化为动画数据配置文件。

步骤一:生成源数据

打开Texture Merger,选择编辑类型为Sprite Sheet,将纹理图全选(按顺序排列)拖入(记住千万不要直接拖文件夹,不然可能顺序会乱,就对不上动画的顺序了!!),完成后导出,会生成雪碧图和对应json。

步骤二(上代码啦):将源数据转化为目标数据,可自定义帧率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 /**
* 用法:node transfer
* (将雪碧图json放在./spriteJson目录下,
* 生成的同名文件动图帧信息json会在./resource/assets/mc目录下)
*/
const fs = require('fs');
const path = require('path');

const filePath = path.resolve('./spriteJson');

fileDisplay(filePath);


function fileDisplay(filePath) {
fs.readdir(filePath,function(err,files){
if(err){
console.warn(err);
}else{
//遍历读取到的文件列表
files.forEach(function(filename){
if(filename.match(/.*\.json/)) {
const result = JSON.parse(fs.readFileSync(path.join(filePath, filename)));
readFile(result, filename);
}
})
}
})
};

function readFile(result, filename) {
const file = path.join(__dirname, `/resource/assets/mc/${filename}`);
const data = {};
const frameMsg = {};
frameMsg.frameRate = process.argv[2] || 25; //帧率,可从命令行输入参数
frameMsg.events = [];
frameMsg.frames = [];
Object.keys(result.frames).forEach((key) => {
frameMsg.frames.push({
"res": key,
"x": result.frames[key].offX,
"y": result.frames[key].offY,
})
delete result.frames[key].offX;
delete result.frames[key].offY;
delete result.frames[key].sourceW;
delete result.frames[key].sourceH;
});
data.mc = {};
data.mc[filename.match(/(.*)\.json/)[1]] = frameMsg;
data.res = result.frames;
// 写入文件
fs.writeFile(file, JSON.stringify(data), function(err) {
if (err) {
console.warn(err);
}
console.log('文件创建成功,地址:' + file);
});
};

以上~生成的数据就可以直接当作动画数据用啦。如需要自定义FRAME_LABEL,可在代码中加入判断,或在生成的数据中手动添加。

CATALOG
  1. 1. 步骤一:生成源数据
  2. 2. 步骤二(上代码啦):将源数据转化为目标数据,可自定义帧率