2

我目前正在使用来自 Flame 的 SpriteAnimationWidget,我想通过单击按钮来获得不同的动画。

为了测试这是否有效,我通过单击按钮来更改 SpriteAnimationWidget 的动画参数。1 秒后,小部件必须返回其原始动画。

这是我的代码:

Future<void> playReaction() async {
  setState(() {
    isPlaying = true;
    state = 'reaction';
  });

  await Future.delayed(Duration(milliseconds: 1000));

  setState(() {
    isPlaying = false;
    state = 'idle';
  });
}

在构建内部,我将返回:

if(state == 'reaction') {
  spriteAnimation = reactionSprite!.createAnimation(row: 0, stepTime: 0.1, from: 0,  to: 10);
  print('reaction');
}
else if(state == 'idle'){
  spriteAnimation = sprite!.createAnimation(row: 1, stepTime: 0.2, from: 0,  to: 4);
  print('idle');
}

return Container(
  height: widget.size,
  child: Stack(
      fit: StackFit.expand,
      children: [
        Positioned.fill(
          child: SpriteAnimationWidget(
            animation: spriteAnimation!,
            anchor: Anchor.center,
          )
        ),
      ]
  ),
);

变量 sprite 和 reactorSprite 是我使用 SpriteSheet.fromColumnsAndRows() 预加载的精灵表。

问题是,虽然我的应用程序成功运行 playReaction() 并到达 print('reaction'),但 SpriteAnimationWidget 仍在播放空闲动画而不是反应动画。我知道它正在以某种方式重建,因为当我按下按钮(加上打印消息)时,我可以看到动画中有一点不自然的不连续性。

为什么 setState() 没有使用新的动画参数更新 SpriteAnimationWidget?

我对 Flutter 和 Flame 比较陌生,所以我希望得到一些帮助或建议。

附言。我尝试使用相同的精灵表来更改不同的行(而不是像上面的代码那样使用完全不同的精灵表),但结果是一样的。

4

1 回答 1

1

这实际上是一个错误,我们正在修复

同时,作为一种解决方法,您可以在每次更改动画时更改小部件的键,并且它应该更新小部件。

于 2021-12-12T14:24:35.693 回答