Skip to main content

[CoronaSDK] FLSprite: Flash Sprite Sheet Parser

由於手上有個案子會使用到大量的動畫,之前與客戶配合時為了方便客戶製作,素材都是採用 Flash 或 PhotoShop 輸出 TexturePacker 可打包格式做 sprite sheet 使用。不過為了打包需要輸出大量的 swf,雖然可以使用 Flash 製作 app 用動畫已經簡化的很多步驟,但是某程度上還是有點不便,於是簡單研究了一下 Flash CS6+ 的內建輸出 Sprite Sheet 功能,並分析其輸出的 JSON-Array 格式給 CoronaSDK 使用。

不過嚴格說起來, Flash 打包 Sprite Sheet 的算法並沒有很好,尤其是有些時候,判定整個 MovieClip 範圍的長寬會有錯誤,這時候就是調整一下 MovieClip 後重新打包,也許就會正確,但是其判定規則因為沒有多加研究,所以目前不明,請有發現的朋友們告知一下,謝謝。



How to use?

在 FlashCS6+ 內製作動畫的 MovieClip 後,打開 Libaray(元件庫),點選你需要輸出的動畫 MovieClip 或圖片 Clip 後,按滑鼠右鍵,點選 Generate Sprite Sheet… ,其他設定如下, FlSprite 目前僅支援 JSON-Array 格式輸出。左邊視窗所列的名稱清單,將在 CoronaSDK 中使用。

Converts JSON file to UTF–8 encoding.

這點很重要,由於 Flash 輸出的 json 檔案是 UTF–16 編碼,這時候需要將其轉檔成 UTF–8 否則 Lua 的檔案讀入時會呈現中斷的亂碼,解析就會失敗。很多文字編輯器都有這類功能,如 Sublime Text,就可以在下拉是功能表 File 中找到 Save with Encoding 將檔案轉存成 UTF–8。不然參考一下線上轉換器:UTF–16 to UTF–8 online converter

Usage:

local FLSprite = require "FLSprite"
-- FLSprite.load( jsonPath [,optional: system path ][, optional: isPreload boolean ] )
-- local sheetInfo = FLSprite.load("demo.json")
-- isPreload=true,  preload texture in memory
local sheetInfo = FLSprite.load("demo.json", true)
local sheet = sheetInfo:getImageSheet()

New Image

-- newImage
local girl = display.newImage( sheet, sheetInfo:getFrameIndex("Character Horn Girl.png" ))
girl.x = 100; girl.y = 100

New ImageRect

-- newImageRect
local frameIndex, frameData = sheetInfo:getFrameData("Character Horn Girl.png")
local girl1 = display.newImageRect( sheet, frameIndex, frameData.width, frameData.height )
girl1.x = 180; girl1.y = 100

Sprite

-- sprite
local data = sheetInfo:getSequenceData("ppl01_act1")
-- rewrite loopCount, default is loop
data.loopCount = 3
-- rewrite loopDirection
data.loopDirection = "bounce"
local sp = display.newSprite( sheet , data )
sp.x = 180; sp.y = 240
sp:play()
-- sprite for all actions
local index = 2
local data1 = sheetInfo:getSequenceData()
local sp1 = display.newSprite( sheet , data1 )
sp1.x = 120; sp1.y = 320
sp1:play()

local function swapSheet()
    sp1:setSequence( "ppl01_act"..index )
    index = index==2 and 1 or 2
    sp1:play()
end

timer.performWithDelay( 2000, swapSheet, 0 )

Clear cache

-- remove all groups and then...
FLSprite.clear("demo.json")

--clear all caches
FLSprite.clear()

Comments

Popular posts from this blog

[AIR] JoSiResize - Mobile 開發小工具

JoSiResizev0.6.0,Adobe AIR 3 runtime之前開發 tool app 的時候並沒有很深刻的體認到圖片素材的 resize 是一個很麻煩的事情...畢竟圖片使用量並不大,等到開發遊戲類的 app 才發現光處理不同螢幕尺寸的圖片素材是一個相當折磨人的工作。
因此 JoSiResize app 誕生了~~~原理是採用最小 scale 長寬比例不變的方式進行放大縮小。使用方法非常簡單,設定好變更的尺寸,接下來,將需要處理的圖片檔案全選直接拖曳到視窗內,畫面即會跳出預備儲存的檔案夾選擇畫面,確認後即開始轉檔。

PureMVC for Titanium Mobile

為了秉持著哪裡都要用 PureMVC 的想法,試著修改 PureMVC 官網上提供的 Javascript 版本給 Titanium 使用。
**source code**
有任何問題請上:Titanium Mobile 中文開發者論壇

建立 instance 的方法:使用 Puremvc 為 namespace
Ti.include('puremvc-js-1.0.js');
var c = Puremvc.clone( Puremvc.SimpleCommand );
var p = Puremvc.clone( Puremvc.Proxy, "TestProxy", "This is TestProxy's data" );
var m = Puremvc.clone( Puremvc.Mediator , "MainMediator" );

[Unity] erinylin.lazylib - Cookie for PlayerPrefs

有鑑於 PlayerPrefs 測試與版本更新問題,將大家都愛用的 PreviewLabs.PlayerPrefs 打包起來,製作重點還是以懶人為主,基本上 PlayerPrefs 資料更新與數量並不可能會有強烈衝擊效能的狀況產生,所以為了方便開發,就弄了一個視覺化工具,方便除錯用。

雖然 PreviewLabs.PlayerPrefs 作者都宣告放棄他們的版權,不過為了尊重程式,僅僅加入了兩個公用函式,其他並無更改。

內有:
Cookie ManagerCookie 用 DataObject 混合編輯 ScriptableObject執行階段除錯視窗工具當然還是有懶人常數檔案輸出資料版本控制,方便更新版後儲存資料更新功能其實很多,有興趣的請自行到 Github 下載並參考範例吧!