iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0

(它是個Component。)

Camera是指「遊戲要顯示給玩家看的範圍」。
但這樣說還是太抽象。

簡單來說,遊戲一次性運作的資料範圍經常是遠比玩家在螢幕上看到的多。
像「怪物從螢幕外朝玩家丟火球」這樣的事情會發生,就是因為怪物在螢幕外、但依舊被運行著。
任何東西一旦出了螢幕,就不執行「Render」,以節省記憶體與增加效能,——這是遊戲設計的黃金三角原則,在沒有遊戲引擎的時代,如何判斷一個物件是否在螢幕範圍內,是遊戲設計很重要的學問,但現在遊戲引擎也幫我們做好了!(所以遊戲引擎的主要功能應該有兩件。)

比較尷尬的是(因為提到了所以必須承認):我到目前為止所做的所有Canvas繪圖,其實都在違反這個原則。(所以要把細部的Canvas繪圖在拆散到遊戲引擎的Component框架中,讓Component框架幫我判斷是否要進行這個環節的Canvas繪圖。)

Camera並不是幫我們處理這整件事情的工具,Camera是把處理結果呈現給我們看的一個管道,讓我們可以藉由這個工具去知道「目前會Render哪裡到哪裡的範圍」這樣的資訊。
但它還是有提供一些控制功能,例如「目前應該要將螢幕移動到遊戲世界的哪個位置」,甚至連「應該要用什麼樣的角度呈現遊戲世界」這樣的功能都有提供。


「follow」(跟隨特定Component)、「moveBy」(移動特定數值的距離)、「moveTo」(移動到特定位置)、「setBound」(設定移動限制範圍),關於如何移動監視器,Flame提供了這四個功能。
因為它是個2D遊戲引擎,所以這些功能的輸入與設定也都限定2D二維座標。


  @override
  void onDragUpdate(DragUpdateEvent event) {
    camera.moveBy(-event.localDelta/10);
  }

在說明如何移動BodyComponent的地方就使用過類似的功能,只是這裡拿來「移動整個遊戲」而已。

至於為何要將「event.localDelta」除以10...這數值就見仁見智了。反正我覺得這樣的數值操作起來最合理、camera移動幅度最接近操作手感。

另外,如何轉動camera的方式比想像中的複雜,因為camera裡面還提供了很多物件,其中「viewfinder」就是用來處理「角度」的工具。


  @override
  void update(double dt) {
    super.update(dt);
    
    camera.viewfinder.angle += dt/2;

  }

上面這段範例,整個畫面就開始旋轉起來了。


上一篇
關於Flame.World
下一篇
不規則的牆(Wall:BodyComponent)
系列文
用Flutter Flame做遊戲!Live!32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言