分享

Flash+TexturePacker+jsfl 导出序列帧到cocos2d

 quasiceo 2015-01-06

Flash+TexturePacker+jsfl 导出序列帧到cocos2d  

2013-04-25 16:40:47|  分类: cocos2d |举报 |字号 订阅

前言:

TexturePacker这个工具的口碑就不多说了,不得不赞一下TexturePacker的作者Andreas Loew,他有一个对开发者或者blogger的免费利好举措(详细点击这里),昨天早上发了申请,下午就收到Kerstin代表Andreas发过来的邮件,把TexturePackerPhysicsEditorkeylicense免费赠送给我了(价值rmb260+)。赞Flash+TexturePacker+jsfl 导出 序列帧 - Sylar_Lin - 低调做人高调做事

好了,对Andreas Loew的感激,先说到这里,因为我之前是做webgame的,现在用TexturePacker结合flash就是想把webgame发布成序列帧给cocos2dx使用。

flash cs6也有生成序列帧(Generate Sprite Sheet)的功能,为什么不使用呢?
其实cs6这个功能非常好,就是输出后的坐标有问题,特别是trim后(这里),不知道为什么会这样,我也暂时没有深究如何修正转换,如果有修的公式或者方案,写个air来修正也是一个不错的选择。

所以现在不得不研究一下TexturePacker(下称TP),TP非常容易使用,基本上不用进行什么别的设置,直接把资源或者文件夹拉到界面右变的Sprites列表就行了,我现在的工作流是把swf导出成spritesheet,现在我说一下需要注意的问题:

1。必须每个资源元素都是独立的一个swf文件,并且动画的时间线要表现在舞台的时间线上。否则TP会把舞台上面的资源集合当成一张图片
2。每个资源舞台的尺寸很重要,关于这个问题,我们先来看一下导出来的plist数据:
Flash+TexturePacker+jsfl 导出 序列帧 - Sylar_Lin - 低调做人高调做事
上图是截取了一个ResLibSKillSpark这个有7帧动画中第5帧的信息,其中重点说一下sourceSize这个值,TP导出的这个值是取自flash的舞台尺寸,也就是说TP会认为你的动画尺寸是这么大,这点很关键,比如我们新建一个fla,舞台尺寸是550x400,其实这个fla你要导出来的只是舞台上面左上角的一个10x10的星星,那么导出来后用到cocos2dx上,你会看到的星星会偏移到左上角的了(AnchorPoint设置成0.5,0.5的情况,如果设置成0,0,则会偏移到上方去)。
3。动画中的每一帧表现不要超出舞台的范围,否则会被TP裁剪掉

综上1,2,3点,最好的处理方式是,把资源每一帧都拷贝到独立的一个fla舞台的主时间线上,并且设置舞台大小,来适应最大的那一帧的表现范围

实现方案定下来后,折腾的机械性动作就来了,我相信没有哪个搞webgame的会把每个美术资源细节到一个美术数字都独立成一个fla/swf,像我们游戏的library.fla文件里面的素材就已经有几百个了,现在为了输出正确的library序列帧,要用到jsfl来帮忙,省去这机械化的行为。

我现在的做法是,
1。新建一个移动端资源library.fla文件,把要用到的资源都放到舞台上面,然后实例名字改成导出到plist的的key字段。
Flash+TexturePacker+jsfl 导出 序列帧 - Sylar_Lin - 低调做人高调做事
 
2。选择舞台上面要导出的元件,执行jsfl。(我是选择所有,如果不想导出某些原件,则去掉选择,jsfl源代码贴在下文)
Flash+TexturePacker+jsfl 导出 序列帧 - Sylar_Lin - 低调做人高调做事

执行完成后,会弹出报告:(ps:我的jsfl代码会把舞台上面选择的原件都分别创建独立的fla,期间ide会不断新建fla,所以不要恐慌以为我写病毒给你了
Flash+TexturePacker+jsfl 导出 序列帧 - Sylar_Lin - 低调做人高调做事
 
而在library.fla对应目录下面就会生成格子的fla以及对应的swf,把这个目录拉到tp里面,TP则会自动更新。
Flash+TexturePacker+jsfl 导出 序列帧 - Sylar_Lin - 低调做人高调做事
 
Flash+TexturePacker+jsfl 导出 序列帧 - Sylar_Lin - 低调做人高调做事

总结:
好了,导出操作就是这么简单,基本上需要花费时间的地方,就只有在等待jsfl在flash ide中跑的过程。
而TP我基本上没设置过什么,简单的导入和发布而已。我只介绍TP+flash+jsfl的工作流而已,别的TP进阶处理我还是小白没深入研究,不敢多说贻笑大方。反正现在是用正版,以后慢慢挖掘吧Flash+TexturePacker+jsfl 导出 序列帧 - Sylar_Lin - 低调做人高调做事

jsfl代码如下:

var dom = fl.getDocumentDOM();
var myItems = dom.selection;//只对舞台上选择了的原件进行操作
var len = myItems.length;
var checkIndex = 0;
var folderURI = dom.pathURI.replace(dom.name,"");//fla所在路径
var outputFolder = "";//"library/"//输出到相对fla所在的哪个文件夹下面
var isOutputFla = true;//是否输出fla
var report = "fla所在文件路径:\n" + folderURI;
//alert(report);

var t = new Date().getTime();
exportSwf();
var durationT =(new Date).getTime()-t;
alert(report+"\n共 " + len + " 个swf文件\n耗时: " + durationT + " ms");

function exportSwf(){
var ele = myItems[checkIndex];
var results = fl.findObjectInDocByName(ele.name, dom);
fl.selectElement(results[0],true);
var oldTimeline = dom.getTimeline();
oldTimeline.setLayerProperty('locked', false, 'all');
var layersNum = oldTimeline.layerCount;
for(var i = 0;i < layersNum ; i++){
oldTimeline.setSelectedLayers(i,false)
}
oldTimeline.copyLayers();
//粘贴层
var newDom = fl.createDocument("timeline");
var newTimeline = newDom.getTimeline();
newTimeline.pasteLayers();

//设置适合的舞台尺寸
var w = 0;
var h = 0;
var frameLen = newTimeline.frameCount;
for(var i = 0;i<frameLen ; i++){
newTimeline.setSelectedFrames(i,i);
var rec = newDom.getSelectionRect();
w = Math.max(w,rec.right>>0);
h = Math.max(h,rec.bottom>>0);
}

fl.getDocumentDOM().width = w + 5 >>0;//某些矢量图的情况flash选择的范围会不准确,偏小,所以这里加上5个像素,具体细节可以在对应导出的fla里面做微调
fl.getDocumentDOM().height = h + 5 >>0;
//return;
//输出swf,fla
var outputSwfName = ele.name + ".swf"
var outputFlaName = ele.name + ".fla";
var outputSwfURI = folderURI + outputFolder + outputSwfName;
var outputFlaURI = folderURI + outputFolder + outputFlaName;
newDom.name = outputFlaName;
if(isOutputFla){
fl.saveDocument(newDom, outputFlaURI);
}
newDom.exportSWF(outputSwfURI,false);
//关闭新建的fla返回旧的fla上,并退出编辑模式切换到舞台的主线时间线上
fl.closeDocument(newDom,false);
newDom.exitEditMode();

//递归
checkIndex++;
report +="\n" + outputSwfName;
if(checkIndex<len){
exportSwf();
}
}

阅读(1640)| 评论(0)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约