游戏循环

Flame中的Game Loop (直译:游戏循环)模块来自于「游戏循环」概念。

游戏循环-01

绝大多数的游戏基于这两种函数构建:

  • 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提供了名为HasWidgetsOverlaymixin,它将使Flutter的widget能够显示在game实例的顶部,这使得构建“暂停界面”或者不属于component的屏幕元素变得非常容易。

若要使用它,只需在game类中添加一个HasWidgetsOverlaymixin。这样,您将获得两个可用的新函数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可能不会生效。

Flame中文站 all right reserved,powered by Gitbook最后修改: 2020-08-09 20:14:55

results matching ""

    No results matching ""