Flutter使用Flame游戲引擎開發(fā)實現(xiàn)(-)

再說一次,F(xiàn)lutter非常的牛址儒,數(shù)年前用IOS原生想要寫一款螞蟻攻防的二維游戲,但是復(fù)雜的Object-C開發(fā)到一半衅疙,覺得邏輯混亂復(fù)雜莲趣,畫面也不自然。于是不得不放棄饱溢。

當(dāng)最近認識了Flutter以及跨平臺的開發(fā)時喧伞,不禁萌生了再次使用Flutter來完成這款游戲的想法,先后了解了Flame和SpriteWidget游戲引擎绩郎,由于Flame相對多一點說明潘鲫,因此決定采用Flame進行開發(fā),關(guān)于SpriteWidget也是可以實現(xiàn)的肋杖,貌似功能更豐富溉仑,但是好像沒有再更新了。

Flame開發(fā)游戲可以參考以下說明和Demo:

1. Create a Mobile Game with Flutter and Flame – Beginner Tutorial

2. 中文翻譯(有空繼續(xù))- Flame開發(fā)Flutter游戲 (二)

3. Github Demo - japalekhin/langaw

4. Github Demo - flame-engine/trex-flame

如果僅僅制作一個類似于langaw的小型游戲状植,參考Tutorial和langaw就夠了浊竟,但是稍微復(fù)雜一些的游戲,就不能夠使用Game類津畸,需要使用BaseGame類振定,使用Components,相對來講洼畅,位置的相對計算吩案,render,components.add, 以及update的使用帝簇,就需要搞清楚相互的關(guān)系。然后Flame說明比較簡單靠益,能找到的資料也非常有限丧肴。

通過在開發(fā)中遇到的問題,記錄一下Flame的一些游戲中用到的場景如何實現(xiàn)胧后,絕對原創(chuàng)芋浮,目前絕無僅有,全互聯(lián)網(wǎng)唯一。

(-)旋轉(zhuǎn)的物體

參考Flame Issue #90給出了完整的旋轉(zhuǎn)一個方塊的方法纸巷,注意prepareCanvas(c);原理是為旋轉(zhuǎn)目標(biāo)準(zhǔn)備canvas镇草,尺寸大小為目標(biāo)大小,然后update改變目標(biāo)的angle瘤旨,當(dāng)然角度改變按照anchor來進行梯啤。

Square(double size, this.rotate) {
? width = height = size;
? anchor = Anchor.center;
}

@override
void render(Canvas c) {
? prepareCanvas(c);

? c.drawRect(Rect.fromLTWH(0, 0, width, height), Palette.white.paint);
? c.drawRect(Rect.fromLTWH(0, 0, 3, 3), Palette.red.paint);
? c.drawRect(Rect.fromLTWH(width / 2, height / 2, 3, 3), Palette.blue.paint);
}

定義對象時,定義一個width = height = size;然后在render方法中從(0, 0, width, height)繪制對象存哲,這樣改變angle就可以進行旋轉(zhuǎn)因宇,如果不是這樣,會按照你定義的整個對象類尺寸進行旋轉(zhuǎn)祟偷。

這樣就有幾個問題察滑,1,如何將這個類變成PositionComponent修肠?贺辰;2, 如果對象是Sprite或者動畫AnimationComponent嵌施,又如何旋轉(zhuǎn)饲化?3, 如果添加多個對象在一起艰管,如何旋轉(zhuǎn)滓侍?

下面就是我的心得體會,當(dāng)然中間也踩了很多坑牲芋,做了很多測試撩笆。

(待續(xù))

Flame的生命周期:

參考Flame Issue#16 ,可以在對于BaseGame或者Game通過設(shè)備App的lifeCycle進行控制:

@override
void lifecycleStateChange(AppLifecycleState state) {
? if (state != AppLifecycleState.resumed) {
??? // pause your updates
??? // pause all audio players
? } else {
??? // resume your updates
??? // resume all audio players
? }
}

The Game class has a listener for changes in the app lifecycle, which can hook to resume and paused. You can also stop your update logic with a flag variable as well, so that your game doesn't update while on background.

Game類有一個app的lifecycle的監(jiān)聽缸浦,可以用來處理resume/paused的狀態(tài)轉(zhuǎn)換夕冲。你可以使用一個標(biāo)簽參數(shù)來停止你的upate邏輯,這樣你的游戲就不會在后臺繼續(xù)更新裂逐。

IphoneX 劉海屏適配:

參考:Flutter iPhoneX 劉海屏適配

final double topPadding = MediaQuery.of(context).padding.top;

final double bottomPadding = MediaQuery.of(context).padding.bottom;

如果使用的是自定義布局的話歹鱼, Flutter 提供了媒體查詢的接口, 可與獲取到上邊距和下邊距的值卜高。
上邊距在 iPhoneX 上的值是 44弥姻, 在其他設(shè)備上的值是 20, 是包含了電池條的高度的掺涛。

下邊距在iPhoneX 上的值是34庭敦,在其他設(shè)備上的值是 0。

現(xiàn)在Flutter出了一個新的Widget薪缆,叫做 SafeArea 秧廉, 直接在外面包一層這個Widget, 就可以讓子Widget 不會被劉海覆蓋了。

MediaQuery可以建立widget查詢解析給定的子樹疼电。但是對于Flame嚼锄,不是簡單的widget,上面方法使用時無法輸入context蔽豺。

參考:Flutter Tips - MediaQuery;

使用MediaQueryData.fromWindow(window)獲取window的信息区丑,這樣來獲取上下邊界信息。

topPadding = MediaQueryData.fromWindow(window).padding.top;

bottomPadding = MediaQueryData.fromWindow(window).padding.bottom;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茫虽,一起剝皮案震驚了整個濱河市刊苍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌濒析,老刑警劉巖正什,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異号杏,居然都是意外死亡婴氮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門盾致,熙熙樓的掌柜王于貴愁眉苦臉地迎上來主经,“玉大人,你說我怎么就攤上這事庭惜≌肿ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵护赊,是天一觀的道長惠遏。 經(jīng)常有香客問我,道長骏啰,這世上最難降的妖魔是什么节吮? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮判耕,結(jié)果婚禮上透绩,老公的妹妹穿的比我還像新娘。我一直安慰自己壁熄,他們只是感情好帚豪,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著草丧,像睡著了一般志鞍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上方仿,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音,去河邊找鬼仙蚜。 笑死此洲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的委粉。 我是一名探鬼主播呜师,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贾节!你這毒婦竟也來了汁汗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤栗涂,失蹤者是張志新(化名)和其女友劉穎知牌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斤程,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡角寸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忿墅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扁藕。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疚脐,靈堂內(nèi)的尸體忽然破棺而出亿柑,到底是詐尸還是另有隱情,我是刑警寧澤棍弄,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布望薄,位于F島的核電站,受9級特大地震影響照卦,放射性物質(zhì)發(fā)生泄漏式矫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一役耕、第九天 我趴在偏房一處隱蔽的房頂上張望采转。 院中可真熱鬧,春花似錦瞬痘、人聲如沸故慈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽察绷。三九已至,卻和暖如春津辩,著一層夾襖步出監(jiān)牢的瞬間拆撼,已是汗流浹背容劳。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闸度,地道東北人竭贩。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像莺禁,于是被迫代替她去往敵國和親留量。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容