蒼時弦也
蒼時弦也
資深軟體工程師
發表於

V-Play Engine 與 Corona SDK 的簡易比較

原本這篇是想寫關於 V-Play Engine 來制作一個簡單的小遊戲,不過後來因為作業上的需求,我有另外去接觸 Corona SDK 於是就變成了一篇比較文。

雖然兩者大概都是接觸約一周到兩週的程度,沒辦法做太深入地分析與討論,但是就我自己的感覺來說,最後是選擇了 Corona SDK 來做為制作遊戲的引擎。

雖然實際上比較想制作 PC/Mac 平台的遊戲,不過就現況來說遊戲引擎都轉戰移動裝置市場,也只好先暫時如此了⋯⋯

既然要做比較,那麼還是開個表格來好好對照一下會比較恰當。

V-Play Game EngineCorona SDK
收費方式Android/iOS 發佈收費依照營業額升級方案
使用語言QML/JavaScriptLua
教學文件無經驗初學者較容易懂適合有經驗者閱讀
設計架構概念上好懂,實際撰寫與程式開發差異大標準的 Lua 風格,與一般程式人員習慣類似
引擎架構感覺還在發展中比較完整
模擬運行一般 Qt 建制出來的應用Corona 內建的模擬器
建置測試需手動上傳後下載放入手機整合在軟體內,仍需手動匯入手機
使用案例幾乎沒有看到官網有幾個不錯的作品
使用範圍純遊戲開發一般 APP 或遊戲

以上是我想到的項目,其實有些好像是廢話啊(笑

事實上,假設沒有要制作 PC/Mac 的遊戲需求,我認為選擇 Corona SDK 會比選擇 V-Play 還好,在 V-Play 的撰寫上對有經驗的開發者(會寫程式)是件很微妙的的感覺,怎麼寫怎麼不對勁。

關於這個問題,我認為是 QML 造成的關係,其實這個概念很好,不過不斷的建立階層然後組合起來,其實感覺非常的微妙⋯⋯

1import V-Play 1.0
2
3EntityBase {
4	Rectangle {
5		width: 10
6		height: 10
7	}
8}
 1import V-Play 1.0
 2import "Box.qml"
 3
 4GameWindow {
 5	Scene {
 6		Box {
 7			x: 10
 8			y: 10
 9		}
10	}
11}

不過架構概念上其實蠻適合撰寫遊戲,因為是以元件的形式去組合,其實在設計遊戲架構時是不錯的。 不過卻會因為不斷的加入同樣的東西去設定某個元件而越來越囧吧 XDD

另一方面 Corona SDK 寫起來就是單純的 Lua 毫無違和啊 XDD

 1local storyboard = require("storyboard")
 2local scene = storyboard.newScene()
 3
 4function scene:createScene( event )
 5  -- Do something ...
 6end
 7
 8function scene:enterScene( event )
 9	-- Do something repeate
10end
11
12function scene:exitScene( event )
13 -- Do something ...
14end
15
16function scene:destroyScene( event )
17 -- Do something ...
18end
19
20scene:addEventListener("createScene", scene)
21scene:addEventListener("enterScene", scene)
22scene:addEventListener("exitScene", scene)
23scene:addEventListener("destroyScene", scene)
24
25return scene

Event Driven 類型的設計,感覺跟遊戲設計上比較接近。

註:V-Play 是在元件中敘述 collision 時的動作,而 Corona 則是對物件或者場景監聽事件,就邏輯上本身不太一樣。


而實際製作上,其實差異上大概就是幾個設定時的做法問題。 (其實主要差異大概就是上面提的這樣,目前我用 V-Play 做了打磚塊的原型,而 Corona 則是一款守塔遊戲原型)

在使用 V-Play 的部分,因為都直接寫在原件中,所以基本上不太需要一些特殊設定。

Corona 是使用這種方式對物理和漸變(transition)做處理的。

1
2local physics = reqire("physics")
3-- Some Physics Settings ...
4
5-- Some Object
6local object = display.newRect(0, 0, 10, 10)
7physics.addBody(object, {})
8transition.to(object, {x=100, time=1000})

此時,假設我要取消漸變,就會出現「我該怎麼取消」的問題⋯⋯ 因此會需要改寫成這樣:

1
2object.transition = transition.to(object, {x=100, time=1000})
3
4--- Some Event Trigger
5transition.cancel(object.transition)

需要另外儲存,不過幸好在 Lua 中物件基本是利用 Table 創造的,可以很輕易的加入屬性。 不過另一方面也要小心,因為 Corona 在很多地方都不會提醒你有錯誤(也可能是 Lau 的關係)

1local object = display.newRect(0, 0, 10, 10)
2function object:removeSelf()
3	-- Do something ...
4end

但實際上 removeSelf 是預設用來刪除物件的語法,現在被我們自己覆蓋掉,反而造成系統無法使用正確的方式移除物件,這部分需要很小心。

就目前的經驗來看,我能做得比較大致上就到這邊。

之後就等我有更深入地研究再來討論這些東西了~

如果文章有誤,也請大家指正。