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);
}
}