2012年1月4日星期三

Flash 匯出連續 PNG 圖檔

需要將 MovieClip 的影格,以連續圖檔的方式匯出使用,懶得自己寫 JSFL,找了幾篇文章:

Batch image exporting from .fla
http://journal.reallyenglish.com/2010/01/30/batch-image-exporting-from-fla.html

JSFL for Exporting Layers as Individual PNGs
http://summitprojectsflashblog.wordpress.com/2008/11/03/jsfl-for-exporting-layers-as-individual-pngs/

Export Flash library items as PNG’s with JSFL
http://abitofcode.com/2011/11/export-flash-library-items-as-pngs-with-jsfl/

最後組出以下程式,
將主時間軸上,每個 layer 的每個 frame 都會獨自輸出一張 png 圖檔,輸出檔名是由 layer.name 與 frame 組合而成。

var doc = fl.getDocumentDOM();
var lyrs = doc.getTimeline().layers;

var len = lyrs.length;
var lyr;
var originalType;
var i;

// Get a save location.
var saveDir = fl.browseForFolderURL("Choose a folder in which to save your exported PNGs:");
if (saveDir) {
 // Get the Flash document's name, and strip off the final ".fla", and build a base name for the exported files.
 fl.outputPanel.clear();
 var docName = doc.name;
 var extensionIndex = docName.lastIndexOf(".fla");
 if (extensionIndex == docName.length - 4) {
  docName = docName.substring(0, extensionIndex);
 }
 
 // Acceptable values are "normal", "guide", "guided", "mask", "masked", and "folder".
 var originalTypes = new Array();

 // Grab all original layer types.  Need to do this before setting to guide, because otherwise a mask layer turned
 // to guide would would turn a masked layer into a normal layer.
 for (i=0; i < len; i++) {
  lyr = lyrs[i];
  originalTypes[i] = lyr.layerType;
 };

 // Guide all layers.
 for (i=0; i < len; i++) {
  lyr = lyrs[i];
  lyr.layerType = "guide";
  lyr.visible = false;
 };

 var tl = doc.getTimeline();
 var frameCount = tl.frameCount;

 // Save layers that were originally "normal" as PNGs, one-by-one.
 for (i=0; i < len; i++) {
  lyr = lyrs[i];
  originalType = originalTypes[i]
  if (originalType == "normal" || originalType == "guided") {
   lyr.layerType = "normal";
   lyr.visible = true;
   for(var k=0; k<frameCount; k++){
    tl.currentFrame = k;
    exportPng(lyr.name + "_" + k);
   }
   lyr.layerType = "guide";
   lyr.visible = false;
  }

  // In this case, we need to loop backwards until we find the mask layer, then re-mask this layer, before we export.
  if (originalType == "masked") {
   for (var j=i; j >= 0; j--) {
    if (originalTypes[j] == "mask") {
     var maskLyrSearch = lyrs[j];
     maskLyrSearch.layerType = "mask";
     lyr.layerType = "masked";
     maskLyrSearch.visible = true;
     lyr.visible = true;
     for(var k=0; k<frameCount; k++){
      tl.currentFrame = k;
      exportPng(lyr.name + "_" + k);
     }
     maskLyrSearch.layerType = "guide";
     lyr.layerType = "guide";
     maskLyrSearch.visible = false;
     lyr.visible = false;
     break;
    }
   };
  }

 };

 // Reset all layers to their original types.
 for (i=0; i < len; i++) {
  lyr = lyrs[i];
  lyr.layerType = originalTypes[i];
  lyr.visible = true;
 };

}

function exportPng(fn) {
 var pngName = saveDir + "/" + fn + ".png";
 doc.exportPNG(pngName, true, true);
 fl.trace("Exported: " + pngName);
}

3 意見:

Ben Chang 提到...

記錄一下相似工具

SWFSheet – create sprite sheets from SWFs
http://www.bit-101.com/blog/?p=2939

Unknown 提到...

請問想做這類似的遊戲
http://www.youtube.com/watch?v=AkDz5mgD9Z4
用flash cs
有什麼書或網站可以學習
我是新手沒什麼基礎
不好意思麻煩你了

Lance Han 提到...

您好,不好意思冒昧打擾,我在你以前的相片中看到了郎遠聞這個人,他是我失聯多年的表哥,這幾個月想起了他們家,所以在網路上搜尋他們的名字,最後在你以前的網站裡找到了照片,不好意思想請問你是否還有跟他聯絡呢,不知道可不可以拜託你幫我給他個消息,請跟她說我是他的表弟季剛,好久不見了,很希望可以跟他們連絡上,謝謝。