2013年3月4日 星期一

跨平台App 開發:Corona SDK 簡介

跨平台App 開發

近幾年,行動裝置崛起,其火熱的程度應該不需要我再引用什麼數據來說明。
總之,行動裝置上 App的開發,也就變成了瘋狂工程師們可以做的事情之一。
不過,用來開發 App的語言和軟體不計其數。光是作業系統就有 Android和 iOS兩大平台(當然還有Windows啦...)。最老實的作法,就是使用 Java和 Objective-C分別針對兩大平台開發原生的 App。

如果你真的只想專攻其中一個平台的市場,用這最老實的作法當然沒有問題。不過,如果你想要用這種方法兩邊通吃,要嘛你真的武功高強,要嘛你財大氣粗、人手充裕,否則要同時掌握兩種語言,同樣的東西要做兩次,可是耗時費力的。

為了解決這種問題,我們通常會選擇一些跨平台的開發工具軟體。這些開發工具可以幫助我們,只要寫一次的程式,就能製作出兩種平台的App。常見的軟體有:Adobe Air、PhoneGap、Titanium、Corona SDK.....等等族繁不及備載。

這些工具所使用的語言各自不同,也各有優缺點。但本人學藝不精,比較熟悉的只有Adobe Air (for Flash) 和 Corona SDK

Corona SDK

Corona SDK (簡稱 Corona)就是今天要介紹的主角。

Corona SDK 主程式
Corona 的主程式,其實是一個模擬器(Simulator)+編譯器(Compiler)。

它所使用的是一種稱之為 Lua的語言,你可以使用任何自己習慣的文字編輯器,來撰寫Lua的程式碼(Corona 不提供編輯器,我自己使用的是Notepad++)。只要將檔案儲存成 main.lua,就可以使用Corona 模擬器運行。模擬器可以模擬幾種不同尺寸的裝置,並能夠直接看到程式運行的結果。因為是使用直譯器來運行,所以一改好程式碼,只要按下Ctrl+R就可以立即(0.1秒!?)看到修改後的運行結果。

這比起慢慢編譯,再安裝到裝置上測試,實在快非常非常多(Adobe Flash 也有同樣方便的模擬器)。等到確定要發佈時,再讓Corona 進行編譯,輸出成 Android或 iOS的安裝檔就行了。


Lua

接下來,稍微介紹一下 Lua這種語言。
根據維基百科的說法:「Lua程式語言是一個簡潔、輕量、可擴展的腳本語言。」「Lua的目標是成為一個很容易嵌入其它語言中使用的語言。」

Lua是一種彈性非常大的腳本語言,跟一般的程式語言(例如 Java、C#或 ActionScript 3)比起來,它的限制非常少,非常容易塑造,但是相對的,它相當鬆散,幾乎沒有什麼預設的架構,網路通訊、圖形界面等都沒有預設提供(這裡說的是最原始的Lua,Corona 裡的 Lua當然都有),更不要說物件導向的封裝與繼承了(這Corona確實沒有)。

用現實生活的東西來比喻,Lua就像是一塊萬能黏土。當它是一坨在那裏的時候,他什麼都不是,啥也不能做,但又有無限的潛能可以變成任何東西。

而一般的程式語言,就像是精緻的樂高玩具,你要輪子有輪子,要窗戶有窗戶,每個零件彼此的接合處都經過精心的設計,甚至連齒輪槓桿一樣不缺。很容易就可以使用現成的零件做出房子、跑車等結構。

但是相對的,樂高的限制在於,你只能依照它的規定與限制組合零件。你將很難用方型的零件,來做出圓形,如果輪子的洞在中心,你很難做出輪軸不在中心的車子。

而黏土的好處是,雖然你甚至必須自己捏一個輪子,才有輪子可以用,但是你捏出來的輪子可大可小,可以是任何形狀。

Corona+Lua

我不曉得你看到這裡,對Lua這種語言有什麼感覺。是覺得「噢好棒,自由度好大啊~!」,還是覺得「我討厭連輪子都沒得用!」。

其實,輪子並不是問題,因為 Corona 已經幫我們做了不少東西。Corona給我們的 Lua已經被擴充到相當豐富的程度。圖片旋轉縮放、由多張圖組成的動畫、嵌入網頁、系統彈出視窗、HTTP、Socket、甚至連Box2D遊戲物理引擎都內建在其中。就其功能上我認為沒話說。

雖然經過 Corona改造後的 Lua語言功能齊全。不過,它在語法上不嚴謹與鬆散(但也相對易於擴充)的本質依然沒有改變。從我的觀點來看,這既是好事,也是壞事,這點我之後再談。

說了這麼多,也該來點語法範例才對,這樣才知道我到底在說什麼東西。
local myString="hello"
myNumber=999
print(myString.." world!"..tostring(myNumber))
這段語法的前兩行都是在指定變數,第三行把變數與字串連接,印出「hello world!999」。
從1,2行可以看出,Lua的變數宣告並不嚴謹,無法指定變數的型別(不過值當然還是有型別的,常用的有 String、Number、Boolean、Table 等...)。

第1行使用 local 關鍵字將 myString 宣告為「區域變數」,第二行則是直接把 myNumber宣告為「全域變數」(根本不像宣告...是直接使用了吧...Orz)。
另外,有些語言(例如ActionScript3)是用「+」來連接字串,不過Lua很奇特的使用了「..」(兩點)。而 tostring竟然全部都是小寫(寫成 toString會比較容易看吧!),這對習慣使用駝峰式命名法的我來說,真是有莫名的違和感...可是人家是官方的API,我也不能拿它怎樣...Orz。

或許是我少見多怪,但令我傻眼的是,變數值竟然也可以這樣指定:
local myString,myNumber="hello",999
print(myString.." world!"..tostring(myNumber))
這裡的第1行跟剛才的1,2行意思幾乎一樣,只差 myNumber現在成了區域變數。
我相信,跟我一樣少見多怪習慣寫 Java或 AS3的朋友,看到這裡應該也會開始覺得:「Lua真是一種莫名其妙神奇又方便的語言哪~」

目前這裡展示的範例,都還只是 Lua語言最基本的部分,而到底 Corona在這些之外,又為 Lua增加了哪些重裝火力呢?

(等我有閒,心情好再寫下一集吧~XD)