Flutter Flame教程11 -- Util 工具

我跑步前腳先著地發表於2020-05-04

Util 工具類


Position

在構建遊戲所需的各種模組中,Dart和Flutter都有一些不同的類來處理二維雙點概念。API中特別常見的是math.Point和ui.Offset。

Position類是一個幫助與這些類輕鬆轉換的實用工具類。

它也有別於這些提供類的預設實現(math.Point和ui.Offset),因為它是可變的,並且提供了一些有用的操作方法。

Util 類


這個類,可以通過Flame訪問。這個雷包含相互獨立、很好使用的稀疏函式。

建議通過Flame.util getter呼叫此類中的函式,以利用Flame引擎準備的單個例項。

Flame.util.fullScrren()

呼叫時,這將禁用所有的SystemUiOverlay,是應用程式全屏。擋在main函式中呼叫時,讓你的應用程式全屏(沒有頂部和底部欄)

Flame.util.setLanscape()

這個方法設定整個應用程式的方向(有效地,包括遊戲)為橫屏,依賴於作業系統和裝置設定,應該允許左和右橫屏方向。為了設定應用方向為特定方向的橫屏,使用Flame.util.setLandscapeLeftOnly或者Flame.util.setLandscapeRightOnly

Flame.util.setPortrait()

這個方法設定整個應用程式的方向(有效的,包括遊戲)為豎屏,依賴於作業系統和裝置設定,應用允許上和下豎屏方向。為了設定應用為特定方向的豎屏,使用Flame.util.setPortraitUpOnly或者Flame.util.setPortraitDownOnly

Flame.util.setOrientation()和Flame.util.setOrientations()

如果需要在允許的方向上更好的控制(不需要直接處理SystemChrome),可以使用setOrientation(接收一個單一的DeviceOrientation作為引數),setOrientations(接收一個List 作為可能的方向)。

**注意:**首先在非同步主系統中呼叫這個方法,等待其值以避免在為生產而構建時影響具體裝置的大小錯誤。

Flame.util.addGestureRecognizer()Flame.util.removeGestureRecognizer

這兩個函式幫助註冊(取消註冊)手勢識別,這樣遊戲就能允許輸入了。關於這兩個函式在這裡.

其他函式

  • text: 這裡
  • drawWhere:非常簡單的函式,手動將偏移值應用於Canvas上。渲染通過函式提供的內容,然後重置畫布,而不使用畫布內建的save/restore函式。這可能非常有用,因為BaseGame使用畫布的狀態,你不應該弄混它。

Timer 定時器


Flame提供了一個簡單的使用程式類,可幫助你處理倒數計時和類似事件的事件。

倒數計時例子:

import 'dart:ui';
import 'package:flame/game.dart';
import 'package:flame/position.dart';
import 'package:flame/text_confgi.dart';
import 'package:flame/time.dart';

class MyGame extends Game {
    final TextConfig textConfig = TextConfig(color: const Color(0xFFFFFFFF));
    final countdown = Timer(2);
    
    MyGame() {
        countdown.start();
    }
    
    @override
    void update(double dt) {
        countdown.update(dt);
        if(countdown.isFinished()) {
            // do something ...
        }
    }
    
    @override
    void render(Canvas canvas) {
        textConfig.render(canvas, "Countdown: ${countdown.current.toString()}",Position(10, 100);
    }
}
複製程式碼

間隔例子:

import 'dart:ui';
import 'package:flame/game.dart';
import 'package:flame/position.dart';
import 'package:flame/text_config.dart';
import 'package:flame/time.dart';

class MyGame extends Game {
    final TextConfig textConfig = TextConfig(color: const Color(0xFFFFFFFF));
    Timer interval;
    
    int elapsedSecs = 0;
    
    
    MyGame() {
        interval = Timer(1, repeat: true, callback: () {
            elapsedSecs += 1;
        });
        interval.start();
    }
    
    @override
    void update(double dt) {
        interval.update(dt);
    }
    
    @override
    void render(Canvas canvas) {
        textConfig.render(canvas, "Elapsed time: $elapsedSecs", Position(10, 150));
    }
}
複製程式碼

定時器例項也可以在BaseGame遊戲內部通通過TimerComponent使用。

Timer Component

import 'package:flame/time.dart';
import 'package:flame/components/timer_component.dart';
import 'package:flame/game.dart';

class MyBaseGame extends BaseGame {
    MyBaseGaem() {
        add(
            TimerComponent(
                Timer(10, repeat: true, callback: () {
                    print("10 seconds elapsed");
                }
            )
            ..start()
        );
    }
}
複製程式碼

相關文章