// ignore_for_file: avoid_renaming_method_parameters import 'dart:async'; import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; /// {@template google_word} /// Loads all [GoogleLetter]s to compose a [GoogleWord]. /// {@endtemplate} class GoogleWord extends Component with HasGameRef, Controls<_GoogleWordController> { /// {@macro google_word} GoogleWord({ required Vector2 position, }) : _position = position { controller = _GoogleWordController(this); } final Vector2 _position; @override Future onLoad() async { await super.onLoad(); gameRef.addContactCallback(_GoogleLetterBallContactCallback()); final offsets = [ Vector2(-12.92, 1.82), Vector2(-8.33, -0.65), Vector2(-2.88, -1.75), Vector2(2.88, -1.75), Vector2(8.33, -0.65), Vector2(12.92, 1.82), ]; final letters = []; for (var index = 0; index < offsets.length; index++) { letters.add( GoogleLetter(index)..initialPosition = _position + offsets[index], ); } await addAll(letters); } } class _GoogleWordController extends ComponentController with HasGameRef { _GoogleWordController(GoogleWord googleWord) : super(googleWord); final _activatedLetters = {}; void activate(GoogleLetter googleLetter) { if (!_activatedLetters.add(googleLetter)) return; googleLetter.activate(); final activatedBonus = _activatedLetters.length == 6; if (activatedBonus) { gameRef.audio.googleBonus(); gameRef.read().add(const BonusActivated(GameBonus.googleWord)); component.children.whereType().forEach( (letter) => letter.deactivate(), ); _activatedLetters.clear(); } } } /// Activates a [GoogleLetter] when it contacts with a [Ball]. class _GoogleLetterBallContactCallback extends ContactCallback { @override void begin(GoogleLetter googleLetter, _, __) { final parent = googleLetter.parent; if (parent is GoogleWord) { parent.controller.activate(googleLetter); } } }