0

目前我正在试验 Flutter 和 Flame 游戏引擎。为此,我扩展了 Flame 的 BaseGame 类,并在其构造函数中进行了一些繁重的处理。繁重的处理包括从其他图像中合成图像并最终将其绘制到临时 Canvas 上,并将结果存储在 Picture 对象中。

ui.PictureRecorder rec = new ui.PictureRecorder();
Canvas tempCanvas = new Canvas(rec, bgRect);
// left out picture operations
ui.Picture pic = rec.endRecording();

为了最终获得一个 Image 对象,我需要调用返回 Future 的异步.toData()方法。我将调用包装在异步方法 getImage()

getImage(ui.Picture pic, Rect bgRect) async {
    background = await pic.toImage(bgRect.width.toInt(), bgRect.height.toInt());
    done = true;
}

背景是一个 Image 类型的类变量,在 BaseGame 类的 render() 方法中使用)

问题是,因为它是异步的,所以我在游戏构造函数中的其余语句都会被执行,并且在它完成后,render() 方法会触发,但背景可能还不可用。为了解决这个问题,我添加了一个 bool 类型的类变量done,它在 getImage() 方法中设置为 true。现在我修改了 render() 以等待 done 为真。

void render(Canvas canvas) {
    if (done) {
        canvas.drawImage(background, new Offset(0.0, 0.0), new Paint());
    }
}

当然,这并不优雅。有没有办法在扩展 BaseGame 类的构造函数中等待 .toImage() 方法完成?我尝试使构造函数异步,例如:

class TheGame extends BaseGame {
    Image background;
    bool done = false;

    TheGame(DeviceOrientation orientation) async {  
    }
}

但这给了我错误:

修饰符“异步”不能应用于构造函数的主体

我还能尝试使其“同步”吗?

4

1 回答 1

0

如果您真的需要在第一帧渲染之前的图像,您可以创建一个负责创建的静态方法TheGame

class TheGame extends BaseGame {
    final Image background;

    TheGame._(DeviceOrientation orientation, this.background);

    static Future<TheGame> create(DeviceOrientation orientation) async {
      return TheGame._(orientation, await generateImage());
    }
}

但是我认为如果您在没有背景图像的情况下渲染几帧并没有真正的伤害,那么我建议您简单地检查background != null而不是done属性,这感觉有点多余。

于 2019-04-11T18:58:45.180 回答