Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import 'dart:async';
import 'package:suguru/cubit/activity/activity_cubit.dart';
import 'package:suguru/models/activity/activity.dart';
import 'package:suguru/models/activity/types.dart';
class BoardAnimate {
// Start game animation: blinking tiles
static AnimatedBoardSequence createStartGameAnimationPatterns(Activity activity) {
AnimatedBoardSequence patterns = [];
int patternsCount = 3;
for (int patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
AnimatedBoard pattern = [];
for (int row = 0; row < activity.boardSizeVertical; row++) {
List<bool> patternRow = [];
for (int col = 0; col < activity.boardSizeHorizontal; col++) {
patternRow.add(((patternIndex + row + col) % 2 == 0));
}
pattern.add(patternRow);
}
patterns.add(pattern);
}
return patterns;
}
// Win game animation: fill board with colored rows, from bottom to top
static AnimatedBoardSequence createWinGameAnimationPatterns(Activity activity) {
AnimatedBoardSequence patterns = [];
int patternsCount = activity.boardSizeHorizontal + activity.boardSizeVertical;
for (int patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
AnimatedBoard pattern = [];
for (int row = 0; row < activity.boardSizeVertical; row++) {
List<bool> patternRow = [];
for (int col = 0; col < activity.boardSizeHorizontal; col++) {
patternRow.add(row > (patternIndex - 4));
}
pattern.add(patternRow);
}
patterns.add(pattern);
}
return patterns;
}
// Default multi-purpose animation: sliding stripes, from top left to right bottom
static AnimatedBoardSequence createDefaultAnimationPatterns(Activity activity) {
AnimatedBoardSequence patterns = [];
int boardSideLength = activity.boardSizeHorizontal;
int patternsCount = boardSideLength;
for (int patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
AnimatedBoard pattern = [];
for (int row = 0; row < activity.boardSizeVertical; row++) {
List<bool> patternRow = [];
for (int col = 0; col < activity.boardSizeHorizontal; col++) {
patternRow.add(((patternIndex + row + col) % 4 == 0));
}
pattern.add(patternRow);
}
patterns.add(pattern);
}
return patterns;
}
static void startAnimation(ActivityCubit activityCubit, String animationType) {
final Activity activity = activityCubit.state.currentActivity;
AnimatedBoardSequence patterns = [];
switch (animationType) {
case 'start':
patterns = createStartGameAnimationPatterns(activity);
break;
case 'win':
patterns = createWinGameAnimationPatterns(activity);
break;
default:
patterns = createDefaultAnimationPatterns(activity);
}
int patternIndex = patterns.length;
activityCubit.updateAnimationInProgress(true);
const interval = Duration(milliseconds: 200);
Timer.periodic(
interval,
(Timer timer) {
if (patternIndex == 0) {
timer.cancel();
activityCubit.resetAnimatedBackground();
activityCubit.updateAnimationInProgress(false);
} else {
patternIndex--;
activityCubit.setAnimatedBackground(patterns[patternIndex]);
}
},
);
}
}