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

Merge branch '2-add-pick-random-tetrimino' into 'master'

Resolve "Add "pick random tetrimino""

Closes #2

See merge request !2
parents 5e297ab2 7881024a
No related branches found
No related tags found
1 merge request!2Resolve "Add "pick random tetrimino""
Pipeline #3910 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.1 app.versionName=0.0.2
app.versionCode=1 app.versionCode=2
Add minimal "pick random tetrimino" feature
Ajout du minimal "pioche un tetrimino au hasard"
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:tetrisdual/layout/board_painter.dart'; import 'package:tetrisdual/layout/board_painter.dart';
import 'package:tetrisdual/provider/data.dart'; import 'package:tetrisdual/provider/data.dart';
import 'package:tetrisdual/utils/game_utils.dart';
class Board { class Board {
static Container buildGameBoard(Data myProvider, double boardWidth) { static Container buildGameBoard(Data myProvider, double boardWidth) {
...@@ -13,9 +14,7 @@ class Board { ...@@ -13,9 +14,7 @@ class Board {
child: Center( child: Center(
child: GestureDetector( child: GestureDetector(
onTapUp: (details) { onTapUp: (details) {
double xTap = details.localPosition.dx; GameUtils.pickRandomTetrimino(myProvider);
double yTap = details.localPosition.dy;
print('xTap: ' + xTap.toString() + ' / yTap: ' + yTap.toString());
}, },
child: Container( child: Container(
child: CustomPaint( child: CustomPaint(
......
import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:tetrisdual/provider/data.dart'; import 'package:tetrisdual/provider/data.dart';
...@@ -6,9 +8,118 @@ class BoardPainter extends CustomPainter { ...@@ -6,9 +8,118 @@ class BoardPainter extends CustomPainter {
final Data myProvider; 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 @override
void paint(Canvas canvas, Size size) { 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 @override
......
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;
}
}
...@@ -33,36 +33,10 @@ class Game { ...@@ -33,36 +33,10 @@ class Game {
TableRow( TableRow(
children: [ children: [
Column( Column(
children: [ 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,
),
),
],
), ),
Column( Column(
children: [ children: [],
Text(
'Z',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w600,
color: Colors.green,
),
),
],
), ),
], ],
), ),
......
...@@ -32,6 +32,7 @@ class Data extends ChangeNotifier { ...@@ -32,6 +32,7 @@ class Data extends ChangeNotifier {
// Game data // Game data
bool _gameIsRunning = false; bool _gameIsRunning = false;
bool _gameIsFinished = false; bool _gameIsFinished = false;
int _currentTetrimino = 0;
bool get isGameRunning => _gameIsRunning; bool get isGameRunning => _gameIsRunning;
void updateGameIsRunning(bool gameIsRunning) { void updateGameIsRunning(bool gameIsRunning) {
...@@ -45,6 +46,12 @@ class Data extends ChangeNotifier { ...@@ -45,6 +46,12 @@ class Data extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
int get currentTetrimino => _currentTetrimino;
void updateCurrentTetrimino(int currentTetrimino) {
_currentTetrimino = currentTetrimino;
notifyListeners();
}
void resetGame() { void resetGame() {
_gameIsRunning = false; _gameIsRunning = false;
_gameIsFinished = false; _gameIsFinished = false;
......
import 'dart:math';
import 'package:tetrisdual/provider/data.dart'; import 'package:tetrisdual/provider/data.dart';
class GameUtils { class GameUtils {
...@@ -11,4 +13,12 @@ class GameUtils { ...@@ -11,4 +13,12 @@ class GameUtils {
myProvider.resetGame(); myProvider.resetGame();
myProvider.updateGameIsRunning(true); myProvider.updateGameIsRunning(true);
} }
static void pickRandomTetrimino(Data myProvider) {
int newTetrimino = myProvider.currentTetrimino;
while (newTetrimino == myProvider.currentTetrimino) {
newTetrimino = Random().nextInt(5) + 1;
}
myProvider.updateCurrentTetrimino(newTetrimino);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment