void _startPopAnimation()

in lib/src/stage/game_element.dart [175:225]


  void _startPopAnimation(Point<int> start, [Iterable<Point<int>>? reveals]) {
    if (reveals == null) {
      assert(game.state == GameState.lost);

      reveals = Iterable.generate(game.field.length, (i) {
        final c = game.field.getCoordinate(i);
        return _Tuple(c, game.getSquareState(c.x, c.y));
      })
          .where((t2) =>
              t2.item2 == SquareState.bomb || t2.item2 == SquareState.hidden)
          .map((t2) => t2.item1)
          .toList();
    }

    final values = reveals.map((c) {
      final initialOffset =
          Vector(SquareElement.size * c.x, SquareElement.size * c.y);
      final squareOffset = _popExplodeAnimationOffset + initialOffset;

      var delay = _popAnimationHitFrame + ((c - start).magnitude * 4).toInt();
      delay += random.nextInt(10);

      return _Values(c, squareOffset, delay);
    }).toList()
      ..sort((a, b) => a.delay.compareTo(b.delay));

    for (var v in values) {
      final c = v.point;
      final squareOffset = v.squareOffset;

      final se = _boardElement.squareAt(c.x, c.y);
      final ss = se.squareState;

      final texturePrefix =
          ss == SquareState.bomb ? 'balloon_explode' : 'balloon_pop';

      final anim =
          FlipBook(_animations.getBitmapDatas(texturePrefix), _frameRate, false)
            ..x = squareOffset.x
            ..y = squareOffset.y
            ..alpha = 0
            ..mouseEnabled = false
            ..addTo(_popLayer);

      anim.onComplete.listen((e) => anim.removeFromParent());

      stage!.juggler
        ..add(anim)
        ..delayCall(() => _animationDelay(anim, se, ss), v.delay / _frameRate);
    }
  }