目前我正在试验 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 {
}
}
但这给了我错误:
修饰符“异步”不能应用于构造函数的主体
我还能尝试使其“同步”吗?