游戏循环
Flame中的Game Loop (直译:游戏循环)模块来自于「游戏循环」概念。
绝大多数的游戏基于这两种函数构建:
- render(渲染)函数用于绘制游戏的当前状态。
- update(更新)函数接收自上次update以来的时间增量(以秒为单位)并允许你切换至下个状态。
如果你未曾有过游戏开发的经验,可能会认为此概念较为模糊。通俗的讲,
render
处理“能看到的”界面,update
处理“看不见的”数值等操作。
Game
是一个可被继承的 class,并且提供了上述的两种函数。并且Game
类也会提供一个 widget
属性,使你可以轻松将其集成至你的 Flutter 项目!
你可以直接在runApp
函数中直接渲染 Game
类,你也可以扩大你的APP规模,使你的游戏包含路由、其他界面和菜单!
想要使用,只需向下面这样,将 widget 直接添加至 runApp:
main() {
Game game = MyGameImpl();
runApp(game.widget);
}
Flame 提供了功能更加完善的 BaseGame
类和包含物理引擎的 Box2DGame
类,建议你直接使用它们作为 Game 类。
BaseGame
继承 Game
,并替你实现了 Component
。最起码,它包含了最基本的一些Component
,并且在适当的时候传入 update
(更新)以及 render
(渲染)函数。你当然可以扩展这些函数,添加一些操作。当然这里面也提供了一些实用功能,比如传递了 resize
函数(每次屏幕尺寸发生变更,都会将变化传递给所有组件的resize函数)和相机的基本功能。BaseGame.camera
函数控制坐标空间的哪个点应该在屏幕的左上方(默认是 (0,0)
,就像普通的Canvas
一样)。
这里展示一个非常简单的BaseGame
实现类:
import 'dart:ui';
import 'package:flame/components/component.dart';
import 'package:flame/game/base_game.dart';
import 'package:flame/sprite.dart';
class MyCrate extends SpriteComponent {
// 创建一个可以渲染图片"crate.png"的sprite(精灵),并设定其尺寸为16×16
MyCrate() : super.fromSprite(16.0, 16.0, Sprite('crate.png'));
void resize(Size size) {
// 我们不需要在构造函数中定义x和y的值,我们可以在这里定义:
this.x = (size.width - this.width) / 2;
this.y = (size.height - this.height) / 2;
}
}
class MyGame extends BaseGame {
MyGame() {
// 该函数将会第一时间调用resize函数
add(MyCrate());
}
}
若要从 BaseGame
中删除Component集合,可以使用markToRemove
函数。
Flutter的Widget和Game实例
因为Flame中的game是一个widget,所以将Flutter的widget和Flame进行融合相当轻松。但是为了使融合更加简单,Flame提供了名为HasWidgetsOverlay
的mixin
,它将使Flutter的widget能够显示在game实例的顶部,这使得构建“暂停界面”或者不属于component的屏幕元素变得非常容易。
若要使用它,只需在game类中添加一个HasWidgetsOverlay
的mixin
。这样,您将获得两个可用的新函数addWidgetOverlay
以及removeWidgetOverlay
。顾名思义,它们可用于添加/删除game上方的widget,如下所示:
addWidgetOverlay(
"PauseMenu", // 你的附加层标识
Center(child:
Container(
width: 100,
height: 100,
color: const Color(0xFFFF0000),
child: const Center(child: const Text("Paused")),
),
) // 你的小部件,可以是任何Flutter的Widget
);
removeWidgetOverlay("PauseMenu"); // 通过使用定义的标识符来移除指定附加层
Flame显示叠加层时使用的是Stack,因此请务必注意叠加层的添加顺序。先添加的在下,后添加的在上。
你可以点击此处查看关于此特性的例子。
BaseGame 的 Debug 模式
Flame的 BaseGame
类提供了一个名为debugMode
的函数,默认返回false。我们可以重写该函数以启用调试功能。注意,此函数返回的状态,会在添加到game中时通过其component传递,因此,如果在运行时修改debugmode
可能不会生效。