此刻,我正在尝试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对象,我需要调用异步的 .toData()方法,该方法返回Future。 我将调用包装在异步方法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());
}
}
这当然不是很优雅。 有没有办法等待.toImage()方法在扩展BaseGame类的构造函数内部完成? 我试图使构造函数异步:
class TheGame extends BaseGame {
Image background;
bool done = false;
TheGame(DeviceOrientation orientation) async {
}
}
但这给了我错误:
修饰符'async'不能应用于构造函数的主体
我还能尝试使其“同步”吗?
答案 0 :(得分: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
属性,这有点多余