import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:flutter/services.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; /// {@template controlled_plunger} /// A [Plunger] with a [PlungerController] attached. /// {@endtemplate} class ControlledPlunger extends Plunger with Controls { /// {@macro controlled_plunger} ControlledPlunger({required double compressionDistance}) : super(compressionDistance: compressionDistance) { controller = PlungerController(this); } } /// {@template plunger_controller} /// A [ComponentController] that controls a [Plunger]s movement. /// {@endtemplate} class PlungerController extends ComponentController with KeyboardHandler, BlocComponent { /// {@macro plunger_controller} PlungerController(Plunger plunger) : super(plunger); /// The [LogicalKeyboardKey]s that will control the [Flipper]. /// /// [onKeyEvent] method listens to when one of these keys is pressed. static const List _keys = [ LogicalKeyboardKey.arrowDown, LogicalKeyboardKey.space, LogicalKeyboardKey.keyS, ]; @override bool onKeyEvent( RawKeyEvent event, Set keysPressed, ) { if (state?.status.isGameOver ?? false) return true; if (!_keys.contains(event.logicalKey)) return true; if (event is RawKeyDownEvent) { component.pull(); } else if (event is RawKeyUpEvent) { component.release(); } return false; } }