Flutter Flame教程11 -- Util 工具

3,586 阅读2分钟

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()
        );
    }
}