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

Add animations

parent dfd93ea9
Branches
Tags
1 merge request!15Resolve "Add animations"
Pipeline #1899 passed
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=0.0.12 app.versionName=0.0.13
app.versionCode=12 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 { ...@@ -50,7 +50,7 @@ class Cell {
} }
if (BoardUtils.checkGameIsFinished(myProvider)) { if (BoardUtils.checkGameIsFinished(myProvider)) {
myProvider.updateReportMode(false); myProvider.updateReportMode(false);
BoardAnimate.startAnimation(myProvider); BoardAnimate.startAnimation(myProvider, myProvider.gameWin ? 'win' : 'fail');
} }
} }
}, },
......
import 'dart:async'; import 'dart:async';
import 'dart:math';
import '../entities/cell.dart'; import '../entities/cell.dart';
import '../provider/data.dart'; import '../provider/data.dart';
class BoardAnimate { 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 = []; List<List> patterns = [];
int patternsCount = 16; int patternsCount = 16;
...@@ -27,8 +117,23 @@ class BoardAnimate { ...@@ -27,8 +117,23 @@ class BoardAnimate {
return patterns; return patterns;
} }
static void startAnimation(Data myProvider) { static void startAnimation(Data myProvider, String animationType) {
List patterns = createPatterns(myProvider); 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; int _patternIndex = patterns.length;
myProvider.updateAnimationInProgress(true); myProvider.updateAnimationInProgress(true);
......
import '../provider/data.dart'; import '../provider/data.dart';
import '../utils/board_animate.dart';
import '../utils/board_utils.dart'; import '../utils/board_utils.dart';
class GameUtils { class GameUtils {
...@@ -13,6 +14,7 @@ class GameUtils { ...@@ -13,6 +14,7 @@ class GameUtils {
myProvider.updateMinesCount(BoardUtils.getMinesCount(myProvider.sizeHorizontal, myProvider.sizeVertical, myProvider.level)); myProvider.updateMinesCount(BoardUtils.getMinesCount(myProvider.sizeHorizontal, myProvider.sizeVertical, myProvider.level));
myProvider.updateGameRunning(true); myProvider.updateGameRunning(true);
BoardUtils.createInitialEmptyBoard(myProvider); 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