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);
}

2011年11月29日星期二

初探 Unity3D

最近開始看 Unity3D,原因:

  • 未來的藍圖中,預計會支援可輸出 Flash
  • 開發工具,免費,除非你要用到 Pro 級功能,版本比較:http://unity3d.com/unity/licenses.html
  • 有了視覺化開發工具,至少調整物體座標、貼圖、增加粒子引擎、設定物理碰撞...都可以輕易的達成
  • 若要自己寫 Script,它支援 JavaScript、C#、Boo Script,雖然第三種聽都沒聽過,不過能 google 到的範例大多以 JS 寫成,上手不難
  • 若有天想發佈到 iOS / Android 平台
  • Web Player 很小,就算未來對 Flash 輸出的支援程度有限制,也可考慮直接輸出 Unity3D 自己的版本,安裝 plug-in 時不用重新啟動瀏覽器,無痛

2011年11月14日星期一

使用 SecureSocket 連接 Socket Server - Part 2

繼上一篇 使用 SecureSocket 連接 Socket Server 後,實際放到網路環境測試時,這才發現到,透過 SecureSocket 向 Socket Server 索取 policy file 時,也會經過編碼,所以 Socket Server 必須做些調整以支援此機制。

2011年11月3日星期四

2011年10月31日星期一

2011年10月28日星期五

使用 Adobe AIR 2 開發 Socket Server 應用

曾有一個機會,去參觀了某科大的畢展,看到學生使用 Flash 作多人連線遊戲時,使用的技術仍是透過 web server 來廣播訊息,然而 http 是 stateless,並不是真正的即時廣播,而是需要仰賴每個 flash client "定期" 向 web server 撈更新的資料來呈現。

這類的應用通常 server 端都是以 socket server 實作,你可以找 open source 的 java server,或是 Adobe Flash Media Server (FMS) 皆可,然後就可以自己撰寫 server 端的商業邏輯、遊戲引擎。然而若是你不想多學一套程式語言 (通常是 Java 或 .NET),只想使用 ActionScript 的話,而 FMS 的 Server 開發使用 AS2 又令你覺得很不習慣的話,可以嘗試使用 Adobe AIR 2 自己寫一個 socket server。

2011年10月19日星期三

初探 Robotlegs

最近看了一下 robotlegs 的電子書,有興趣學習這項 framework 的人可以參考官網的資源:
http://www.robotlegs.org/

或以下這本電子書:
http://www.wowebook.pro/book/actionscript-developers-guide-to-robotlegs/

2011年10月14日星期五

動態切換負責廣播的 Local Connection 角色,避免受到 FPS 降低的影響

前年底,曾寫了這麼一篇文章:

多 Local Connection 彼此維護名單的機制

當時的想法是,在 "一個遊戲大廳" 負責廣播訊息給 "多個遊戲桌" 的系統中,嘗試做到每個遊戲桌都可以成為替代遊戲大廳負責廣播的角色,使得遊戲大廳不必要存在。

然而,實務上,遊戲大廳 通常不會只具有廣播、控管中心...的角色,有可能在視覺上仍提供其他功能給玩家,譬如遊戲列表、會員帳戶管理、其它服務...,所以沒有 "移除遊戲大廳" 的需要。

而,這兩天我正在思考一個新的 "策略",不再考慮沒有 遊戲大廳 的情況,但可以考慮 "主訊息廣播者" 這個角色是否可以被變更?!