diff --git a/android/gradle.properties b/android/gradle.properties index d9abd55731010fe508f39321892e8002f10e79ef..663881258a10822c0b4abc064b6e0bc0ccf48833 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,5 @@ 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 diff --git a/fastlane/metadata/android/en-US/changelogs/13.txt b/fastlane/metadata/android/en-US/changelogs/13.txt new file mode 100644 index 0000000000000000000000000000000000000000..162771509ac5080fa6b478839fee45df04b21d8f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/13.txt @@ -0,0 +1 @@ +Add multiple animations (start game, win, fail) diff --git a/fastlane/metadata/android/fr-FR/changelogs/13.txt b/fastlane/metadata/android/fr-FR/changelogs/13.txt new file mode 100644 index 0000000000000000000000000000000000000000..f9971670a9a9078c46cecba9821742a2944a0a50 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/13.txt @@ -0,0 +1 @@ +Ajout d'animations (début de partie, victoire, défaite) diff --git a/lib/entities/cell.dart b/lib/entities/cell.dart index 106091c2777045ccd943e9ff8567253c0a395fc9..9bd32ccfcb82a1662cd319cd327b287931640f38 100644 --- a/lib/entities/cell.dart +++ b/lib/entities/cell.dart @@ -50,7 +50,7 @@ class Cell { } if (BoardUtils.checkGameIsFinished(myProvider)) { myProvider.updateReportMode(false); - BoardAnimate.startAnimation(myProvider); + BoardAnimate.startAnimation(myProvider, myProvider.gameWin ? 'win' : 'fail'); } } }, diff --git a/lib/utils/board_animate.dart b/lib/utils/board_animate.dart index d4aae4616d61e740f023a6f4fb9a2b65f49e96e5..be41181f9d93d4e3e10767b879af5d0e3340e38f 100644 --- a/lib/utils/board_animate.dart +++ b/lib/utils/board_animate.dart @@ -1,11 +1,101 @@ 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); diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart index 904838aeaf35257545d4a5825bc90d16533b4362..4e87a3084d55462cdb36f8b3a3ec8a848b841b6e 100644 --- a/lib/utils/game_utils.dart +++ b/lib/utils/game_utils.dart @@ -1,4 +1,5 @@ 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'); } }