flutter_BananaMon是我學習dart/flutter的時候開發的一個練手項目,他不依賴第三方遊戲框架,是一個從零開始的項目,如今已經開源在github。java
google主導的Dart對標微軟主導的TypeScript,可是在web端一直屈居下風,Google可否藉助flutter這款框架鹹魚翻身?整體來說flutter是一個設計用於app開發的跨平臺ui框架,它用dart在android和iOS端實現了對底層圖形庫進行了封裝,並不像react native依賴於平臺的ui框架去實現一個組件,因此flutter更底層、更高效、也帶來了更多可能,跨平臺的遊戲就是其中之一。react
爲了探索dart/flutter的能力,在設計這個項目的時候就考慮到了要同時支持web和flutter。這樣項目通過很小的修改就能夠在三端運行,實踐證實這是可行的。它最初是一個基於dart的web項目,能夠直接在瀏覽器中運行,同時還包含一個簡單的關卡編輯器,使用者能夠用圖形界面中編輯本身的關卡,導出導入關卡等。android
和app同樣每一個遊戲都有一個主循環,在flutter上實現主循環的關鍵代碼git
SchedulerBinding.instance.scheduleFrameCallback(_tick);
複製代碼
而在web上是經過操做dom實現的,爲保證跨平臺性,須要作一層抽象,把實現隱藏起來程序員
遊戲須要作大量的canvas操做,在android平臺flutter對skia圖像庫進行了封裝,在web平臺咱們只要操做H5 canvas 就能夠了,一樣爲了保持跨平臺性,對canvas進行了封裝,詳細代碼都在CanvasWrapper
類中,爲了偷懶,只封裝了用到的api。github
2d遊戲使用了一些雪碧圖和音頻資源。這些資源的加載在不一樣平臺上不一樣: flutter:如今ubspec.yaml
中聲明 H5:經過fetch在後臺加載,解析成對應資源 在ResourceProvider
類中進行了封裝,同時對雪碧圖進行了建模web
經過TapGestureRecognizer
和 ImmediateMultiDragGestureRecognizer
在fluter中實現了觸摸屏點擊和手勢的監聽,在H5端比較簡單,就像寫js同樣監聽按鍵事件就能夠了canvas
音頻播放在H5上比較簡單,由於是基於dom的一切都是水到渠成。而在flutter上好像框架並無支持?只能藉助第三方插件,但願之後能完善吧。目前選擇的是audioplayers的開源插件,不得不說,第三方插件多是一個大坑,由於質量很難保證,要同時支持android 和Ios就更難了api
其餘東西都在代碼中,沒法展開詳說瀏覽器
整體來講dart這門語言有驚喜,也有些地方不那麼讓人愉悅,例如數字類型轉換報錯、沒有匿名類,這讓java程序員很是抓狂
在web端追溯出錯很困難,由於報錯都在循環體中,而這些報錯信息被編譯成js後很難在找到原代碼中究竟是哪裏錯了。
flutter不支持反射,官方團隊態度堅定,他們有他們的理由,然而不少優秀的庫依賴於反射這一特性,若是不支持,是否會阻礙futter生態鏈的發展呢?