早先就聽聞FriceEngine已有中文接口版本, 可惜沒有機會嘗試. 經原作者 @大笨蛋千裡冰封 (Github賬号 @ice1000 )建議, 在FriceEngine的 DSL封裝
的接口基礎上, 添加了對應的中文接口.
下面的代碼利用了新添的中文接口, 實作了一個圓形向方塊加速撞擊後反彈下落的動畫過程(開發環境: IntelliJ IDEA社群版, 更全的測試用例在此, 是參考了
原代碼中的測試用例編寫的):
注: FriceEngine仍在活躍開發中, 本文的接口很可能在新版本中修改. 使用時請參考最新的測試代碼.
接口中文化過程
在命名接口與參數時, 遇到不少需要推敲的問題:
- 英文接口中, (x,y)在不同地方有不同含義, 比如在形狀(方形/圓形)屬性中, 是定位功能(左上角頂點的坐标, 都為正數). 而在
等接口中, 表示的是橫向和縱向的分量, 可以為負. 在中文命名後, 進行了差別:速度
和左上角x/左上角y
. 後者比較累贅, 而且也許應該在注釋而不是命名中說明參數的正負意義, 但鑒于IntelliJ提供了獨到的參數名提示功能, 就暫時把命名的含義最大化了.橫向速度_左負右正/縱向速度_上負下正
- 之前對其他庫中文化也碰到過. 對于重載接口, 暫時還是采用了指派對應英文接口的方式, 但其實是可以用調用中文接口實作, 比如
調用FObject.加速(x: Int, y: Int)
. 這決定了中文化的"深度". 但越"深", 越涉及到實作, 維護的工作量就越大. 個人暫時傾向于盡量"淺"地進行中文化.FObject.加速(x: Double, y: Double)
-
暫時是将中文接口的實作放在了對應英文接口的下面, 這樣的好處是關聯性一目了然, 但也讓它們分散在各處, 帶來一些維護的難度.
另一種方式也許是至少将簡單的對等接口抽取出來, 用一個資料結構描述(類似下面), 然後在編譯之前自動生成這些接口的實作, 但這個腦洞比較大.
whenExit(block: () -> Unit) -> 當退出時(塊: () -> Unit)
ImageObject.url(s: String) -> ImageObject.遠端檔案(網址: String)
...
其他感想
- IntelliJ剛開始用, Kotlin和Gradle也是初學, 在使用和開發過程中遇到不少磕碰. 在此多謝原作者的各種協助與指點. Kotlin的語言特性也讓添加中文接口的實作過程不那麼費勁. 比較印象深刻的是 對屬性的get/set
- 相比之前嘗試的 p5js的動畫繪制 , 感覺FriceEngine的文法更加靈活, 有不少高層接口讓開發更加友善, 比如
, 以及每隔(毫秒數)
, 在p5js中好像沒有類似功能, 使用時需要根據幀數和幀率用算法自行實作. 而且類OO的設計(對形狀可以取名)也是p5js不具備的.當碰撞(某物體名)
- 個人覺得API在形式上的一緻性對易用性比較重要. 作為Kotlin新手, 個人在使用時開始有些文法上的困惑, 尤其是{}和()的使用. 比如代碼中同時有
和:加速(0, 50)
加速 {
橫向加速度_左負右正 = 20.0
}
- 強烈建議改進動畫性能, 過高的CPU占用會讓推廣受限, 尤其是手機app上.
2017-12-21