附加工具
有些工具并不一定适合所有地方。
Position
在构建游戏所需的各种模块时,Dart和Flutter有一些不同的类来处理 2D 坐标点概念。 API中特别常见的有 math.Point
和 ui.Offset
。
Position类是允许一些类型之间轻松转换的实用辅助类。
它也是可变的,它与默认提供的实现( math.Point
和 ui.Offset
)不同,并且提供了一些很有用的操纵方法。
Util Class
可以通过 Flame.util
类访问具有一些稀疏函数,这些函数是独立的且具有很好的功能。
建议通过Flame引擎准备的 Flame.util
单例中的 getter
函数。
Flame.util.fullScreen()
此方法将禁用所有 SystemUiOverlay
,使应用全屏显示。
请在 main
方法中调用,使您的应用全屏显示(无顶部和底部)
Flame.util.setLandscape()
此方法将整个应用程序(实际上是游戏)的方向设置为横向,操作系统和设备设置应同时允许左右横向。
如要将应用程序的方向设置为沿特定方向横向放置,请使用 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 <DeviceOrientation>
作为参数)。
Flame.util.initialDimensions()
返回具有屏幕尺寸( Size
)的 Future
。 由于代码中描述的原因,必须以一种怪异的方式完成此操作。 如果您使用的是 BaseGame
,则可能不需要使用它们,因为每个 Component
都会收到此信息。
注意:首先在 async
主 main
中调用该函数,然后 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()
)
);
}
}