From 337f1b506995db1c7a13b74f01d367c55b710b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr> Date: Thu, 21 Jul 2022 15:52:01 +0200 Subject: [PATCH] Add a "start random game (random image, random tile size)" button --- android/gradle.properties | 4 +- assets/icons/button_random_pick.png | Bin 0 -> 5859 bytes .../metadata/android/en-US/changelogs/47.txt | 1 + .../metadata/android/fr-FR/changelogs/47.txt | 1 + icons/build_game_icons.sh | 1 + icons/button_random_pick.svg | 2 + lib/provider/data.dart | 6 +++ lib/screens/home.dart | 36 ++++++++++++------ lib/utils/game_utils.dart | 22 +++++++++-- 9 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 assets/icons/button_random_pick.png create mode 100644 fastlane/metadata/android/en-US/changelogs/47.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/47.txt create mode 100644 icons/button_random_pick.svg diff --git a/android/gradle.properties b/android/gradle.properties index 7d3ad5f..2c9d43c 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.46 -app.versionCode=46 +app.versionName=0.0.47 +app.versionCode=47 diff --git a/assets/icons/button_random_pick.png b/assets/icons/button_random_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..7268257b2f50ae51d9c1944fbb5b40767d0aa8fd GIT binary patch literal 5859 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/changelogs/47.txt b/fastlane/metadata/android/en-US/changelogs/47.txt new file mode 100644 index 0000000..1c74d3d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/47.txt @@ -0,0 +1 @@ +Add a "start random game" button diff --git a/fastlane/metadata/android/fr-FR/changelogs/47.txt b/fastlane/metadata/android/fr-FR/changelogs/47.txt new file mode 100644 index 0000000..050a248 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/47.txt @@ -0,0 +1 @@ +Ajout d'un bouton "démarrer un puzzle aléatoire" diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh index 720bca3..a4c7b75 100755 --- a/icons/build_game_icons.sh +++ b/icons/build_game_icons.sh @@ -18,6 +18,7 @@ ICON_SIZE=192 AVAILABLE_GAME_IMAGES=" button_back button_shuffle + button_random_pick game_win placeholder tip_hidden diff --git a/icons/button_random_pick.svg b/icons/button_random_pick.svg new file mode 100644 index 0000000..a3e39b9 --- /dev/null +++ b/icons/button_random_pick.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m83.437 0.38264h-73.092c-5.6481 0-9.9672 4.3191-9.9672 9.9672v73.092c0 5.6481 4.3191 9.9672 9.9672 9.9672h73.092c5.6481 0 9.9672-4.3191 9.9672-9.9672v-73.092c0-5.6481-4.3191-9.9672-9.9672-9.9672z" fill="#0d6586" stroke-width="3.3224"/><g transform="matrix(.13283 0 0 .13283 .34007 9.6436)" fill="#fff" fill-rule="evenodd" stroke="#fff" stroke-width="6.049"><path d="m351.68 33.758c1.3438 0.17188 2.6562 0.58984 3.8516 1.2266l206.85 107.8c3.5938 1.9062 5.9805 5.9062 5.9492 9.9766v3.3242c0.25781 1.3477 0.23438 2.6758 0 4.0234v232.4c0 8.0234-3.5977 10.309-8.0508 12.949-67.969 39.805-136.01 79.484-204.05 119.18-4.6602 2.3828-9.293 1.8555-11.898 0.34766-68.398-39.75-136.66-79.73-204.93-119.7-6.5664-3.8711-7.6523-7.6172-7.875-12.426v-233.8c-0.0508-0.60547-0.043-1.1445 0-1.75v-4.5508c4e-3 -4.1055 2.4648-8.1133 6.125-9.9766l207.38-107.8c1.668-0.85156 3.5508-1.2773 5.4258-1.2266 0.40625-0.02344 0.81641-0.02344 1.2266 0zm-1.3984 23.801-189.35 98.352 189.18 110.25 188.82-110.25zm-196.35 119.7v210.88c61.762 35.758 123.37 71.781 184.98 107.8v-210.18c-8.5195-5.043-138.17-81.852-184.98-108.5zm333.2 74.727c-8.7695-0.42969-17.48 3.7969-22.227 11.898-0.0469 0.0742-0.12891 0.10156-0.17578 0.17578-0.0312 0.0547-0.14453 0.12109-0.17578 0.17578-6.9219 11.734-2.9922 26.805 8.3984 33.949l4e-3 -4e-3c0.17578 0.0625 0.34766 0.12109 0.52734 0.17578 11.566 6.625 26.992 2.9727 33.949-8.75v-0.17578c6.6836-11.523 3.2266-26.727-8.5742-33.773-0.0664-0.0391-0.10937-0.13281-0.17578-0.17578-0.0625-0.0391-0.11328-0.14062-0.17578-0.17578-3.5195-2.1172-7.4688-3.1328-11.375-3.3242zm-35.875 59.852c-8.7852-0.25781-17.441 4.0156-22.227 12.074v-4e-3c-0.0586 0.0586-0.11719 0.11328-0.17188 0.17188-6.6836 11.523-3.2266 26.727 8.5742 33.773 0.0664 0.0547 0.10938 0.13281 0.17578 0.17188 0.0625 0.0547 0.11328 0.14062 0.17578 0.17187 11.418 6.8672 26.918 3.1367 33.773-8.5742 0.0312-0.0547-0.0312-0.125 0-0.17188 0.043-0.0781 0.13281-0.0937 0.17578-0.17188 6.9219-11.734 2.9883-26.805-8.3984-33.949h-4e-3c-0.11328-0.0586-0.23047-0.11719-0.34766-0.17188-3.6133-2.0703-7.7305-3.207-11.727-3.3242zm-35.523 60.023c-8.7344-0.25391-17.422 3.9375-22.227 11.898-0.0195 0.0547 0.0195 0.14063 0 0.17188h-0.17578c-7.0586 11.672-2.9102 26.855 8.3984 33.949h4e-3v0.17578c11.703 7.0977 27.117 3.0078 34.125-8.3984v-4e-3c0.0586-0.0547 0.11719-0.11328 0.17188-0.17188 6.9766-11.75 3.1328-27-8.2266-34.125h4e-3c-0.17578-0.0625-0.34766-0.12109-0.52734-0.17578-3.6133-2.0703-7.5547-3.207-11.551-3.3242z"/><path d="m277.98 350.68c19.855 0 36.293 16.441 36.293 36.559 0 19.992-16.316 36.566-36.293 36.566-20.098 0-36.293-16.691-36.293-36.566 0-20.004 16.312-36.559 36.293-36.559z"/><path d="m209.89 259.82c19.98 0 36.293 16.559 36.293 36.559 0 19.875-16.195 36.566-36.293 36.566-19.977 0-36.293-16.574-36.293-36.566 0-20.117 16.438-36.559 36.293-36.559z"/><path d="m346.94 117.8c15.668 0 30 3.6641 41.234 10.379 11.234 6.7148 20.152 17.469 20.152 30.812 0 13.301-8.9531 23.957-20.176 30.633-11.223 6.6758-25.543 10.344-41.211 10.344s-29.992-3.668-41.215-10.344-20.176-17.332-20.176-30.633c0-13.344 8.9258-24.094 20.16-30.812 11.234-6.7148 25.566-10.379 41.234-10.379z"/></g></svg> diff --git a/lib/provider/data.dart b/lib/provider/data.dart index 5deb9c4..d11f57f 100644 --- a/lib/provider/data.dart +++ b/lib/provider/data.dart @@ -9,6 +9,7 @@ class Data extends ChangeNotifier { List _availableImages = []; String _selectedImage = ''; List<MovingTile> _tiles = []; + double _tileImageSize = 1.0; // application state bool _isShufflingBoard = false; @@ -60,6 +61,11 @@ class Data extends ChangeNotifier { notifyListeners(); } + double get tileImageSize => _tileImageSize; + void updateTileImageSize(double tileImageSize) { + _tileImageSize = tileImageSize; + } + void swapTiles(List<int> tile1, List<int> tile2) { int indexTile1 = _tiles.indexWhere( (tile) => ((tile.currentCol == tile1[0]) && (tile.currentRow == tile1[1]))); diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 3db611e..f2047d4 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -24,10 +24,8 @@ class Home extends StatelessWidget { } } - Future<void> selectImage(Data myProvider, String imageCode, double tileImageSize) async { - myProvider.updateIsShufflingBoard(true); - myProvider.updateSelectedImage(imageCode); - GameUtils.startGame(myProvider, tileImageSize); + Future<void> selectImage(Data myProvider, String imageCode) async { + GameUtils.startGame(myProvider, imageCode); } void shuffleAvailableImages(Data myProvider) { @@ -36,7 +34,7 @@ class Home extends StatelessWidget { myProvider.updateAvailableImages(images); } - Container _buildImageSelectorItem(Data myProvider, String image, double tileImageSize) { + Container _buildImageSelectorItem(Data myProvider, String image) { return Container( child: TextButton( style: TextButton.styleFrom( @@ -56,13 +54,13 @@ class Home extends StatelessWidget { ), ), onPressed: () { - selectImage(myProvider, image, tileImageSize); + selectImage(myProvider, image); }, ), ); } - Container _buildImageSelector(Data myProvider, double tileImageSize) { + Container _buildImageSelector(Data myProvider) { if (myProvider.availableImages.length == 0) { getImagesList(myProvider); } @@ -84,8 +82,7 @@ class Home extends StatelessWidget { Column( children: [ if (imgIndex + colIndex < images.length) - _buildImageSelectorItem( - myProvider, images[imgIndex + colIndex], tileImageSize) + _buildImageSelectorItem(myProvider, images[imgIndex + colIndex]) ], ), ], @@ -133,14 +130,15 @@ class Home extends StatelessWidget { var content; - double _tileImageSize = (MediaQuery.of(context).size.width - 70) / _myProvider.tilesCount; + _myProvider.updateTileImageSize( + (MediaQuery.of(context).size.width - 70) / _myProvider.tilesCount); if (_myProvider.isShufflingBoard) { content = Game.buildShufflingIndicatorWidget(); precacheImage(new AssetImage('assets/icons/game_win.png'), context); } else { if (_myProvider.selectedImage == '') { - content = _buildImageSelector(_myProvider, _tileImageSize); + content = _buildImageSelector(_myProvider); } else { content = Game.buildGameWidget(_myProvider); } @@ -166,6 +164,22 @@ class Home extends StatelessWidget { ), onPressed: () => shuffleAvailableImages(_myProvider), ), + TextButton( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + border: Border.all( + color: themePrimaryColor, + width: 4, + ), + ), + child: Image( + image: AssetImage('assets/icons/button_random_pick.png'), + fit: BoxFit.fill, + ), + ), + onPressed: () => GameUtils.startRandomGame(_myProvider), + ), ]; List<Widget> gameActions = [ diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart index c22242a..d3df124 100644 --- a/lib/utils/game_utils.dart +++ b/lib/utils/game_utils.dart @@ -14,12 +14,26 @@ class GameUtils { return 'assets/images/' + imageCode + '.png'; } - static startGame(Data myProvider, double tileImageSize) { + static startGame(Data myProvider, String imageCode) { + myProvider.updateIsShufflingBoard(true); + myProvider.updateSelectedImage(imageCode); + new Timer(new Duration(seconds: 1), () { - GameUtils.splitImageInTiles(myProvider, tileImageSize); + GameUtils.splitImageInTiles(myProvider); }); } + static startRandomGame(Data myProvider) { + List sizes = [3, 4, 5]; + sizes.shuffle(); + myProvider.updateTilesCount(sizes[0]); + + List images = myProvider.availableImages; + images.shuffle(); + + startGame(myProvider, images[0]); + } + static Future<void> resetGame(Data myProvider) async { myProvider.resetSelectedImage(); myProvider.updateIsTipImageDisplayed(false); @@ -58,7 +72,7 @@ class GameUtils { return tiles; } - static Future<void> splitImageInTiles(Data myProvider, double tileImageSize) async { + static Future<void> splitImageInTiles(Data myProvider) async { String imageAsset = getImageAssetName(myProvider.selectedImage); Uint8List imageData = (await rootBundle.load(imageAsset)).buffer.asUint8List(); @@ -81,7 +95,7 @@ class GameUtils { tiles.add(MovingTile( Image.memory(tileData), - tileImageSize, + myProvider.tileImageSize, j, i, j, -- GitLab