(它是個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;
}
上面這段範例,整個畫面就開始旋轉起來了。