Skip to content
Snippets Groups Projects
Commit 038b3bd3 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Merge branch '16-add-animations' into 'master'

Resolve "Add animations"

Closes #16

See merge request !15
parents dfd93ea9 56d02932
No related branches found
No related tags found
1 merge request!15Resolve "Add animations"
Pipeline #1901 passed
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
app.versionName=0.0.12
app.versionCode=12
app.versionName=0.0.13
app.versionCode=13
Add multiple animations (start game, win, fail)
Ajout d'animations (début de partie, victoire, défaite)
......@@ -50,7 +50,7 @@ class Cell {
}
if (BoardUtils.checkGameIsFinished(myProvider)) {
myProvider.updateReportMode(false);
BoardAnimate.startAnimation(myProvider);
BoardAnimate.startAnimation(myProvider, myProvider.gameWin ? 'win' : 'fail');
}
}
},
......
import 'dart:async';
import 'dart:math';
import '../entities/cell.dart';
import '../provider/data.dart';
class BoardAnimate {
static List createPatterns(Data myProvider) {
// Start game animation: blinking tiles
static List createStartGameAnimationPatterns(Data myProvider) {
List<List> patterns = [];
int patternsCount = 4;
int sizeHorizontal = myProvider.sizeHorizontal;
int sizeVertical = myProvider.sizeVertical;
for (var patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
List<List> pattern = [];
for (var row = 0; row < sizeVertical; row++) {
List<bool> patternRow = [];
for (var col = 0; col < sizeHorizontal; col++) {
patternRow.add(((patternIndex + row + col) % 2 == 0));
}
pattern.add(patternRow);
}
patterns.add(pattern);
}
return patterns;
}
// Failed game animation: explosions blowing from exploded mines
static List createExplosionAnimationPatterns(Data myProvider) {
List<List> patterns = [];
int sizeHorizontal = myProvider.sizeHorizontal;
int sizeVertical = myProvider.sizeVertical;
List explodedMines = [];
for (var row = 0; row < sizeVertical; row++) {
for (var col = 0; col < sizeHorizontal; col++) {
if (myProvider.cells[row][col].isExploded) {
explodedMines.add([row, col]);
}
}
}
if (explodedMines.length == 0) {
explodedMines.add([(sizeVertical / 2).floor(), (sizeHorizontal / 2).floor()]);
}
int patternsCount = max(sizeHorizontal, sizeVertical);
for (var patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
List<List> pattern = [];
for (var row = 0; row < sizeVertical; row++) {
List<bool> patternRow = [];
for (var col = 0; col < sizeHorizontal; col++) {
bool isHilighted = false;
for (var mineIndex = 0; mineIndex < explodedMines.length; mineIndex++) {
double distance = sqrt(pow((explodedMines[mineIndex][0] - row), 2) + pow((explodedMines[mineIndex][1] - col), 2));
isHilighted = isHilighted || ((patternIndex + distance) % 3 < 1);
}
patternRow.add(isHilighted);
}
pattern.add(patternRow);
}
patterns.add(pattern);
}
return patterns;
}
// Win game animation: rotating rays from center
static List createWinGameAnimationPatterns(Data myProvider) {
List<List> patterns = [];
int patternsCount = 20;
int sizeHorizontal = myProvider.sizeHorizontal;
int sizeVertical = myProvider.sizeVertical;
for (var patternIndex = 0; patternIndex < patternsCount; patternIndex++) {
List<List> pattern = [];
for (var row = 0; row < sizeVertical; row++) {
List<bool> patternRow = [];
for (var col = 0; col < sizeHorizontal; col++) {
double angle = 2 * atan2((sizeVertical / 2) - col, (sizeHorizontal / 2) - row);
patternRow.add((angle + patternIndex / 3) % 2 < 1);
}
pattern.add(patternRow);
}
patterns.add(pattern);
}
return patterns;
}
// Default multi-purpose animation: sliding stripes, from top left to right bottom
static List createDefaultAnimationPatterns(Data myProvider) {
List<List> patterns = [];
int patternsCount = 16;
......@@ -27,8 +117,23 @@ class BoardAnimate {
return patterns;
}
static void startAnimation(Data myProvider) {
List patterns = createPatterns(myProvider);
static void startAnimation(Data myProvider, String animationType) {
List patterns = [];
switch(animationType) {
case 'start':
patterns = createStartGameAnimationPatterns(myProvider);
break;
case 'win':
patterns = createWinGameAnimationPatterns(myProvider);
break;
case 'fail':
patterns = createExplosionAnimationPatterns(myProvider);
break;
default:
patterns = createDefaultAnimationPatterns(myProvider);
}
int _patternIndex = patterns.length;
myProvider.updateAnimationInProgress(true);
......
import '../provider/data.dart';
import '../utils/board_animate.dart';
import '../utils/board_utils.dart';
class GameUtils {
......@@ -13,6 +14,7 @@ class GameUtils {
myProvider.updateMinesCount(BoardUtils.getMinesCount(myProvider.sizeHorizontal, myProvider.sizeVertical, myProvider.level));
myProvider.updateGameRunning(true);
BoardUtils.createInitialEmptyBoard(myProvider);
BoardAnimate.startAnimation(myProvider, 'start');
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment