import 'dart:ui'; import 'package:flame/game.dart'; import 'package:match_three/game/systems/match_detector.dart'; import 'components/grid_component.dart'; import 'components/background_component.dart'; import 'models/gem.dart'; import '../bloc/game_bloc.dart'; const gridSize = 8 * 64.0 + 32.0; // 8 gems * 64px + padding class MatchThreeGame extends FlameGame { GridComponent? gridComponent; late BackgroundComponent backgroundComponent; late GameBloc gameBloc; Gem? selectedGem; @override Future onLoad() async { backgroundComponent = BackgroundComponent(); add(backgroundComponent); gridComponent = GridComponent(this); add(gridComponent!); } @override void onGameResize(Vector2 size) { super.onGameResize(size); // Center the grid on screen if (gridComponent != null && hasLayout) { gridComponent!.position = Vector2( (size.x - gridSize) / 2, (size.y - gridSize) / 2, ); } } void selectGem(Gem gem) { print(">>> Selecting gem ${gem.name}(${gem.type}) ${gem.row}, ${gem.col}"); if (selectedGem == null) { selectedGem = gem; return; } if (MatchDetector.isValidSwap(gridComponent!.gameGrid, selectedGem!.row, selectedGem!.col, gem.row, gem.col)) { // Attempt swap print( ")) Valid swapping ${selectedGem!.row}, ${selectedGem!.col} with ${gem.row}, ${gem.col}"); gameBloc.add(SwapGems( selectedGem!.row, selectedGem!.col, gem.row, gem.col, )); } else { print( "(( Invalid swapping ${selectedGem!.row}, ${selectedGem!.col} with ${gem.row}, ${gem.col}"); } selectedGem = null; } void setGameBloc(GameBloc bloc) { gameBloc = bloc; } }