附加工具

有些工具并不一定适合所有地方。

Position

在构建游戏所需的各种模块时,Dart和Flutter有一些不同的类来处理 2D 坐标点概念。 API中特别常见的有 math.Pointui.Offset

Position类是允许一些类型之间轻松转换的实用辅助类。

它也是可变的,它与默认提供的实现( math.Pointui.Offset )不同,并且提供了一些很有用的操纵方法。

Util Class

可以通过 Flame.util 类访问具有一些稀疏函数,这些函数是独立的且具有很好的功能。

建议通过Flame引擎准备的 Flame.util 单例中的 getter 函数。

Flame.util.fullScreen()

此方法将禁用所有 SystemUiOverlay ,使应用全屏显示。

请在 main 方法中调用,使您的应用全屏显示(无顶部和底部)

Flame.util.setLandscape()

此方法将整个应用程序(实际上是游戏)的方向设置为横向,操作系统和设备设置应同时允许左右横向。

如要将应用程序的方向设置为沿特定方向横向放置,请使用 Flame.util.setLandscapeLeftOnlyFlame.util.setLandscapeRightOnly

Flame.util.setPortrait()

此方法将整个应用程序(实际上是游戏)的方向设置为纵向,操作系统和设备设置应同时允许上下方向。

如要将应用的方向设置为在特定方向上为纵向放置,请使用 Flame.util.setPortraitUpOnlyFlame.util.setPortraitDownOnly

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

如果需要更好地控制允许的方向(无需直接处理 SystemChrome ),则可以使用 setOrientation (接受 DeviceOrientation 作为参数)和 setOrientations (接受 List <DeviceOrientation> 作为参数)。

Flame.util.initialDimensions()

返回具有屏幕尺寸( Size )的 Future 。 由于代码中描述的原因,必须以一种怪异的方式完成此操作。 如果您使用的是 BaseGame ,则可能不需要使用它们,因为每个 Component 都会收到此信息。

注意:首先在 asyncmain 中调用该函数,然后 await 其返回值,以避免在构建生产环境时影响特定设备的 “size错误”。

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

这两个功能可住注册(和注销)手势识别器,以便游戏可以接受输入。 有关这两个函数的更多信息,请参见此处

其他函数

  • text: 此处
  • drawWhere : 一个非常简单的函数,它手动将偏移量应用于 Canvas ,通过渲染函数给出的内容,然后重置 Canvas ,而无需使用 Canvas 内置的 save/restore 功能。 这可能很有用,因为 BaseGame 使用画布的状态,不应该将搞混。

Timer

Flame提供了一个简单的工具类,您可用于处理倒计时和事件。

倒计时示例:

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));
  final countdown = Timer(2);

  MyGame() {
    countdown.start();
  }

  
  void update(double dt) {
    countdown.update(dt);
    if (countdown.isFinished()) {
      // 做一些逻辑
    }
  }

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

  
  void update(double dt) {
    interval.update(dt);
  }

  
  void render(Canvas canvas) {
    textConfig.render(canvas, "Elapsed time: $elapsedSecs", Position(10, 150));
  }
}

计时器可以通过实例化 TimerComponent 类,用在 BaseGame

计时器组件

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

class MyBaseGame extends BaseGame {
  MyBaseGame() {
    add(
      TimerComponent(
        Timer(10, repeat: true, callback: () {
          print("10 seconds elapsed");
        })
        ..start()
      )
    );
  }
}
Flame中文站 all right reserved,powered by Gitbook最后修改: 2020-08-18 17:19:51

results matching ""

    No results matching ""