Corona SDK 程式設計教學:介紹

PUBLISHED ON SEP 4, 2018 — MOBILE

    本文對跨平台行動應用框架 (cross-platform mobile application frameworks) 和 Corona (原 Corona SDK) 進行一個概念上的介紹,不會太深入技術細節,如果已經熟悉這些概念的讀者可快速讀過或略過本文。

    為什麼使用跨平台行動應用框架?

    每種行動裝置都有自己的系統和 SDK (Software Development Kit),如果我們想要在不同裝置開發相同功能的軟體,開發者需針對每種系統重新寫一次。由於同一個開發者同一時間只能做一件事,正規的作法就是養兩群以上的開發者,平行開發該軟體在各種行動裝置的版本;如果僅由同一群開發者開發兩種以上的版本,可能導致整個開發時程過久。

    對於大公司來說,公司內有多個團隊是司空見慣的事情,但對於小團隊或獨立開發者來說,同時要開發和維護兩個以上的專案就成為一種負擔,跨平台行動應用框架就是針對這種議題而產生的軟體框架。透過這類框架,開發者可在專案內共用 (大部分或全部的) 程式碼,再藉由這些框架所提供的工具轉換成不同平台的軟體。這類工具即是透過共用程式碼來縮短開發時間。

    不過,天下沒有白吃的午餐,跨平台行動框架並不是萬靈丹,原生語言仍是預算充足時的首選。我們在下一節會討論這些框架所用的機制,並且說明什麼時候適合用跨平台行動框架。

    註:原生語言是指行動平台官方指定的語言,像是 Java 或 Kotlin 用於 Android,或是 Swift 或 Objective-C 用於 iOS 等。

    跨平台行動框架方案

    一般來說,跨平台行動框架有以下三種方案:

    • 行動響應式網站 (mobile-responsive websites)
    • 混合模式應用程式 (hybrid applications)
    • 交叉編譯應用程式 (cross-compiled applications)

    行動響應式網站嚴格來說不是行動軟體,而是網站,只是該網站的介面會隨著客戶端裝置的尺寸改變。透過 Bootstrap 或 Foundation 等框架的協助,製作這類網站的門檻大幅降低。但這類軟體無法使用行動裝置的硬體功能,而且在行動裝置上操作瀏覽器其實不是很親和,這類方案僅適用於分享靜態內容。

    混合模式應用程式在 UI 上透過 WebView 顯現,其實內部仍然是透過瀏覽器來生成,但透過一些插件可使用行動裝置的硬體功能,是兼具網頁技術和行動裝置特性的軟體。跨平台行動框架的先鋒 Cordova 就是這類型的框架。這類框架上手容易,但早期行動裝置的效態相對不佳,使得這類軟體的使用者經驗不良。如果程式不吃效能,仍然可考慮這類方案。

    交叉編譯應用程式則是使用單一語言撰寫後,再轉換成各平台的應用程式。一些例子像是 Xamarin、React Native、NativeScript 等。這類型程式不透過 WebView 顯示 UI,通常會比混合模式應用程式來得快。有些框架會將 UI 部分程式碼分開,核心功能部分程式碼則共用,像是 Xamarin;有些則共用所有的程式碼,像是 NativeScript。前者在 UI 調整上較細緻,但程式碼量較多;後者程式碼量少,但可用的 UI 相對受限。

    註:Corona 官方並未對該框架的內部架構發表白皮書,應該屬於交叉編譯應用程式的一種。

    為什麼這類框架沒有完全取代原生語言呢?

    • API 版本落後於原生軟體
    • API 覆蓋率較低
    • UI 難以做細微的調整
    • 學習資源較少

    如果很在意 UI 的呈現或是一些特定 API 的功能,最好還是用原生語言來開發。另外,比起原生語言,這類框架的學習範例相對少,通常只有官方的範例可看,在 Stackoverflow 等論壇的討論度也相對低。這類框架的主要目的在於節省預算和開發時間,適不適合自己的專案,仍需自行評估。

    為什麼使用 Corona?

    Corona (原 Corona SDK) 是一套跨平台行動應用框架,主打電腦遊戲 (mobile games),但其實也可用在應用程式 (business applications) 中。使用 Corona 的好處如下:

    • 易於安裝
    • 易於學習
    • 反應快速的模擬器
    • (核心功能) 免費使用
    • 豐富的 API
    • Corona 市集

    如果有實際使用過一些行動框架就會知道,許多行動框架依賴數個外部軟體或套件,建置環境的過程相當麻煩且容易失敗,耗費許多時間在初期建置開發環境上。相對來說,Corona 將軟體包成單一安裝檔,建置環境的過程簡單,不用耗費時間處理開發環境的問題。

    Corona 使用的手稿語言是 Lua,而 Lua 當初在設計時就有考量易用性,即使是非資訊相關科系的程式人,也可以很快地學會 Lua 的核心語法,用 Lua 來撰寫 Corona 應用程式。

    Corona 的模擬器啟動相當快速,而且內建在 Corona 主程式中,不依賴 Android Studio 或 Xcode 的模擬器。模擬器啟動快速看起來不是什麼了不起的事,但在開發程式的過程中,要反覆地撰寫程式和用模擬器測試,這項特性可使開發的過程更順暢。如果和其他同質框架比較,可發現 Corona 的模擬器的反應速度真的是前段班,對於開發的迭代助益很大。

    Corona 的核心功能是免費的,我們可以自由地下載 Corona,盡情地撰寫和測試程式,只要在開發的尾聲,加入特定的付費外掛,像是去除 Corona 內建登入畫面 (splash screen) 或是 AdMob 外掛等。付費功能皆是選擇性的,開發者可自行選用需要的功能,也可以不使用這些功能。

    如果我們瀏覽一下 Corona 的 API 文件,就可以發現 Corona 已經將行動裝置常用的功能寫成 Lua API,如果內建 API 的功能不足,還可以到 Corona 市集逛逛,看有沒有符合自己需求的外掛。不過,Corona 算是小眾軟體,有些功能還是要自己去實作。要使用 Corona 前,最好先大略地把 API 文件和市集逛逛,確認符合自己的需求。

    不過,Corona 並不是完美的,有一些相對不足的地方:

    • UI 元件 (widgets) 較少
    • 不支援 3D 動畫
    • 封閉原始碼 (closed source)
    • 學習資源相對少

    Corona 主打的項目是 2D 遊戲,在應用程式 (business apps) 上可用的 UI widgets 相對較少。因為在電腦遊戲中,UI 的部分通常也是手刻,所以這件事不會是問題;但若想用 Corona 開發應用程式,現有的 UI 元件相對顯得單薄了些。其實還是可以手刻 UI,但麻煩一些。由於 Corona 主打 2D 遊戲,想做 3D 遊戲的話左轉去看看 Unity,就不要在這浪費時間了。

    Corona 沒有將其開發工具的原始碼公開,如果發現了某個 Corona 本身的問題,只能等待該團隊修復此問題。不過,Corona 已經出來數年了,真的碰到這類問題的機會不多,而且 Corona 本身的迭代還算勤快,有在持續地更新其產品 (可從其 daily build 看出);像是最近又增加了 HTML5 的 build (目前 beta 中),筆者還沒有機會嘗鮮。

    雖然 Corona 本身算是不錯的產品,但是相對小眾,學習資源比較少。而且已經過了話題性 (hype),最近的新書很少。不過,Corona 的 API 變動不大,之前的資料多多少少還是可以參考一下。