Select Git revision
game_end.dart
-
Benoît Harrault authoredBenoît Harrault authored
game_board.dart 4.27 KiB
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:jeweled/cubit/game_cubit.dart';
import 'package:jeweled/models/game.dart';
import 'package:jeweled/models/cell_location.dart';
import 'package:jeweled/ui/painters/game_board_painter.dart';
class GameBoard extends StatefulWidget {
const GameBoard({super.key});
@override
State<GameBoard> createState() => _GameBoard();
}
class _GameBoard extends State<GameBoard> with TickerProviderStateMixin {
final int animationDuration = 500;
List<List<Animation<double>?>> animations = [];
void resetAnimations(int boardSize) {
this.animations = List.generate(
boardSize,
(i) => List.generate(
boardSize,
(i) => null,
),
);
}
void animateCells(List<CellLocation> cellsToRemove) {
final GameCubit gameCubit = BlocProvider.of<GameCubit>(context);
final Game currentGame = gameCubit.state.currentGame;
// "move down" cells
final controller = AnimationController(
vsync: this,
duration: Duration(milliseconds: animationDuration),
)..addListener(() {
if (mounted) {
setState(() {});
}
});
if (mounted) {
setState(() {});
}
Animation<double> animation(int count) => Tween(
begin: 0.0,
end: count.toDouble(),
).animate(CurvedAnimation(
curve: Curves.bounceOut,
parent: controller,
))
..addStatusListener((status) {
if (status == AnimationStatus.completed) {
gameCubit.postAnimate();
resetAnimations(currentGame.settings.boardSize);
setState(() {});
controller.dispose();
}
});
// Count translation length for each cell to move
final List<List<int>> stepsDownCounts = List.generate(
currentGame.settings.boardSize,
(i) => List.generate(