diff --git a/android/gradle.properties b/android/gradle.properties index bc2d95e8567abcfd41c26ebeb95fced48f43e773..818e87b23b224ced309ae5c147e5ed827826e237 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.1 -app.versionCode=1 +app.versionName=0.0.2 +app.versionCode=2 diff --git a/fastlane/metadata/android/en-US/changelogs/2.txt b/fastlane/metadata/android/en-US/changelogs/2.txt new file mode 100644 index 0000000000000000000000000000000000000000..71488257d8ba1afdb81f2222b04d363a0c9ba58b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/2.txt @@ -0,0 +1 @@ +Add minimal "pick random tetrimino" feature diff --git a/fastlane/metadata/android/fr-FR/changelogs/2.txt b/fastlane/metadata/android/fr-FR/changelogs/2.txt new file mode 100644 index 0000000000000000000000000000000000000000..48f5368799e2ce9661a0566cc070e6db1db904e2 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/2.txt @@ -0,0 +1 @@ +Ajout du minimal "pioche un tetrimino au hasard" diff --git a/lib/layout/board.dart b/lib/layout/board.dart index aa3a86d8862034e00b93b6d47e60be4ea230ec3f..009bd5fabbb9d49901007c6e4475586c1da51629 100644 --- a/lib/layout/board.dart +++ b/lib/layout/board.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:tetrisdual/layout/board_painter.dart'; import 'package:tetrisdual/provider/data.dart'; +import 'package:tetrisdual/utils/game_utils.dart'; class Board { static Container buildGameBoard(Data myProvider, double boardWidth) { @@ -13,9 +14,7 @@ class Board { child: Center( child: GestureDetector( onTapUp: (details) { - double xTap = details.localPosition.dx; - double yTap = details.localPosition.dy; - print('xTap: ' + xTap.toString() + ' / yTap: ' + yTap.toString()); + GameUtils.pickRandomTetrimino(myProvider); }, child: Container( child: CustomPaint( diff --git a/lib/layout/board_painter.dart b/lib/layout/board_painter.dart index 8d3d0bf290ce2ccd0479d26e0d9161eb9403c0c4..620de7c5c2c4f803a0d593b2467ff3401c382952 100644 --- a/lib/layout/board_painter.dart +++ b/lib/layout/board_painter.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:tetrisdual/provider/data.dart'; @@ -6,9 +8,118 @@ class BoardPainter extends CustomPainter { final Data myProvider; + void drawPixels(List<List<int>> pixels, Canvas canvas, double drawSize, Color pixelColor) { + int blockWidth = 1; + int blockHeight = 1; + pixels.forEach((pixel) { + int x = pixel[0] + 1; + int y = pixel[1] + 1; + if (x > blockWidth) { + blockWidth = x; + } + if (y > blockHeight) { + blockHeight = y; + } + }); + + double pixelSize = drawSize / (max(blockWidth, blockHeight) + 2); + double xOffset = + (blockHeight > blockWidth) ? (blockHeight - blockWidth) * pixelSize / 2 : 0; + double yOffset = + (blockWidth > blockHeight) ? (blockWidth - blockHeight) * pixelSize / 2 : 0; + + // Fill background + final paintPixelBackground = Paint(); + paintPixelBackground.color = pixelColor; + paintPixelBackground.style = PaintingStyle.fill; + pixels.forEach((pixel) { + int x = pixel[0]; + int y = pixel[1]; + final Rect pixelBackground = Rect.fromPoints( + Offset(xOffset + pixelSize * (x + 1), yOffset + pixelSize * (y + 1)), + Offset(xOffset + pixelSize * (x + 2), yOffset + pixelSize * (y + 2))); + canvas.drawRect(pixelBackground, paintPixelBackground); + }); + + // Border lines + final paintPixelBorder = Paint(); + paintPixelBorder.color = Colors.white; + paintPixelBorder.style = PaintingStyle.stroke; + paintPixelBorder.strokeWidth = 4; + pixels.forEach((pixel) { + int x = pixel[0]; + int y = pixel[1]; + final Rect rectBackground = Rect.fromPoints( + Offset(xOffset + pixelSize * (x + 1), yOffset + pixelSize * (y + 1)), + Offset(xOffset + pixelSize * (x + 2), yOffset + pixelSize * (y + 2))); + canvas.drawRect(rectBackground, paintPixelBorder); + }); + } + @override void paint(Canvas canvas, Size size) { - print('paint'); + double drawSize = min(size.width, size.height); + + // Fill background + final paintBackground = Paint(); + paintBackground.color = Colors.black; + paintBackground.style = PaintingStyle.fill; + + final Rect rectBackground = Rect.fromPoints(Offset(0, 0), Offset(drawSize, drawSize)); + canvas.drawRect(rectBackground, paintBackground); + + // Add tetrimino + switch (myProvider.currentTetrimino) { + // empty + case 0: + break; + // straight + case 1: + drawPixels([ + [0, 0], + [1, 0], + [2, 0], + [3, 0] + ], canvas, drawSize, Colors.cyan); + break; + // square + case 2: + drawPixels([ + [0, 0], + [0, 1], + [1, 0], + [1, 1] + ], canvas, drawSize, Colors.amber); + break; + // T + case 3: + drawPixels([ + [0, 0], + [1, 0], + [2, 0], + [1, 1] + ], canvas, drawSize, Colors.purple); + break; + // L + case 4: + drawPixels([ + [0, 0], + [0, 1], + [0, 2], + [1, 2] + ], canvas, drawSize, Colors.deepOrange); + break; + // skew + case 5: + drawPixels([ + [0, 0], + [0, 1], + [1, 1], + [1, 2] + ], canvas, drawSize, Colors.green); + break; + default: + } } @override diff --git a/lib/layout/color_theme.dart b/lib/layout/color_theme.dart deleted file mode 100644 index 27097af04a0e6f1c17d01f55cd8394ff16fa116d..0000000000000000000000000000000000000000 --- a/lib/layout/color_theme.dart +++ /dev/null @@ -1,20 +0,0 @@ -class ColorTheme { - static Map<String, Map<String, int>> colors = { - 'default': { - '0': 0xffffff, - '1': 0xff6f43, - '2': 0x708cfd, - }, - }; - static int defaultColor = 0x808080; - - static int getColorCode(String skin, String value) { - if (colors.containsKey(skin) && null != colors[skin]) { - Map<String, int>? skinColors = colors[skin]; - if (null != skinColors && skinColors.containsKey(value) && null != skinColors[value]) { - return (skinColors[value] ?? defaultColor) | 0xFF000000; - } - } - return defaultColor | 0xFF000000; - } -} diff --git a/lib/layout/game.dart b/lib/layout/game.dart index cb742a295b8aa858650b680453f635cd4e8a3396..d46557140943a7742594cb5b708f278d55fbae12 100644 --- a/lib/layout/game.dart +++ b/lib/layout/game.dart @@ -33,36 +33,10 @@ class Game { TableRow( children: [ Column( - children: [ - Text( - 'X', - style: TextStyle( - fontSize: 40, - fontWeight: FontWeight.w600, - color: Colors.black, - ), - ), - Text( - 'Y', - style: TextStyle( - fontSize: 15, - fontWeight: FontWeight.w600, - color: Colors.grey, - ), - ), - ], + children: [], ), Column( - children: [ - Text( - 'Z', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w600, - color: Colors.green, - ), - ), - ], + children: [], ), ], ), diff --git a/lib/provider/data.dart b/lib/provider/data.dart index 0b6fa19f8a5db2b9e2b1af9e98483049211686bb..8d0d68858bf76d56e7617584f96b95ff0e1cf78a 100644 --- a/lib/provider/data.dart +++ b/lib/provider/data.dart @@ -32,6 +32,7 @@ class Data extends ChangeNotifier { // Game data bool _gameIsRunning = false; bool _gameIsFinished = false; + int _currentTetrimino = 0; bool get isGameRunning => _gameIsRunning; void updateGameIsRunning(bool gameIsRunning) { @@ -45,6 +46,12 @@ class Data extends ChangeNotifier { notifyListeners(); } + int get currentTetrimino => _currentTetrimino; + void updateCurrentTetrimino(int currentTetrimino) { + _currentTetrimino = currentTetrimino; + notifyListeners(); + } + void resetGame() { _gameIsRunning = false; _gameIsFinished = false; diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart index 8796da9ced6997a04814e571ca7ce2b7e648be5d..86fcd8ae35cfde461553599f94466ff58462d055 100644 --- a/lib/utils/game_utils.dart +++ b/lib/utils/game_utils.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:tetrisdual/provider/data.dart'; class GameUtils { @@ -11,4 +13,12 @@ class GameUtils { myProvider.resetGame(); myProvider.updateGameIsRunning(true); } + + static void pickRandomTetrimino(Data myProvider) { + int newTetrimino = myProvider.currentTetrimino; + while (newTetrimino == myProvider.currentTetrimino) { + newTetrimino = Random().nextInt(5) + 1; + } + myProvider.updateCurrentTetrimino(newTetrimino); + } }