Select Git revision
game_utils.dart
-
Benoît Harrault authoredBenoît Harrault authored
game_utils.dart 3.14 KiB
import 'dart:async';
import 'dart:math';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:image/image.dart' as imglib;
import 'package:puzzlegame/entities/moving_tile.dart';
import 'package:puzzlegame/entities/tile.dart';
import 'package:puzzlegame/provider/data.dart';
class GameUtils {
static String getImageAssetName(String imageCode) {
return 'assets/images/' + imageCode + '.png';
}
static startGame(Data myProvider, String imageCode) {
myProvider.updateIsShufflingBoard(true);
myProvider.updateSelectedImage(imageCode);
new Timer(new Duration(seconds: 1), () {
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);
}
static bool checkTilesetIsCleared(List<MovingTile> tiles) {
for (Tile tile in tiles) {
if (!tile.isCorrect()) {
return false;
}
}
return true;
}
static List<MovingTile> shuffleMovingTiles(List<MovingTile> tiles) {
var random = new Random();
int tilesCount = tiles.length;
for (int i = 0; i < (10 * tilesCount); i++) {
int indexTile1 = random.nextInt(tilesCount);
int indexTile2 = random.nextInt(tilesCount);
MovingTile swap = tiles[indexTile1];
tiles[indexTile1] = tiles[indexTile2];
tiles[indexTile2] = swap;
int swapCol = tiles[indexTile1].currentCol;
tiles[indexTile1].currentCol = tiles[indexTile2].currentCol;
tiles[indexTile2].currentCol = swapCol;
int swapRow = tiles[indexTile1].currentRow;
tiles[indexTile1].currentRow = tiles[indexTile2].currentRow;
tiles[indexTile2].currentRow = swapRow;
}
return tiles;
}
static Future<void> splitImageInTiles(Data myProvider) async {
String imageAsset = getImageAssetName(myProvider.selectedImage);
Uint8List imageData = (await rootBundle.load(imageAsset)).buffer.asUint8List();
imglib.Image image = imglib.decodeImage(imageData) ?? imglib.Image.fromBytes(1, 1, []);
int x = 0, y = 0;
int width = (image.width / myProvider.tilesCount).round();
int height = (image.height / myProvider.tilesCount).round();
List<MovingTile> tiles = [];
for (int i = 0; i < myProvider.tilesCount; i++) {
for (int j = 0; j < myProvider.tilesCount; j++) {
Uint8List tileData = new Uint8List.fromList(imglib.encodeJpg(imglib.copyCrop(
image,
x,
y,
width,
height,
)));
tiles.add(MovingTile(
Image.memory(tileData),
myProvider.tileImageSize,
j,
i,
j,
i,
));
x += width;
}
x = 0;
y += height;
}
myProvider.updateTiles(shuffleMovingTiles(tiles));
myProvider.updateIsShufflingBoard(false);
}
}