From 0927a4ab97948b89bf43c0c503b49ce347ab146f Mon Sep 17 00:00:00 2001 From: alestiago Date: Fri, 1 Apr 2022 11:39:58 +0100 Subject: [PATCH] feat: made Flippers movable --- .../sandbox/lib/stories/flipper/basic.dart | 48 +++++++++++++++++-- .../sandbox/lib/stories/flipper/tracing.dart | 16 +------ 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/packages/pinball_components/sandbox/lib/stories/flipper/basic.dart b/packages/pinball_components/sandbox/lib/stories/flipper/basic.dart index 0e5587ea..f53c5800 100644 --- a/packages/pinball_components/sandbox/lib/stories/flipper/basic.dart +++ b/packages/pinball_components/sandbox/lib/stories/flipper/basic.dart @@ -1,21 +1,35 @@ -import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame/input.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:sandbox/common/common.dart'; -class BasicFlipperGame extends BasicGame { +class BasicFlipperGame extends BasicGame with KeyboardEvents { static const info = ''' Basic example of how a Flipper works. '''; + static final _leftFlipperKeys = { + LogicalKeyboardKey.arrowLeft, + LogicalKeyboardKey.keyA, + }; + + static final _rightFlipperKeys = { + LogicalKeyboardKey.arrowRight, + }; + + late Flipper leftFlipper; + late Flipper rightFlipper; + @override Future onLoad() async { await super.onLoad(); final center = screenToWorld(camera.viewport.canvasSize! / 2); - final leftFlipper = Flipper(side: BoardSide.left) + leftFlipper = Flipper(side: BoardSide.left) ..initialPosition = center - Vector2(Flipper.size.x, 0); - final rightFlipper = Flipper(side: BoardSide.right) + rightFlipper = Flipper(side: BoardSide.right) ..initialPosition = center + Vector2(Flipper.size.x, 0); await addAll([ @@ -23,4 +37,30 @@ class BasicFlipperGame extends BasicGame { rightFlipper, ]); } + + @override + KeyEventResult onKeyEvent( + RawKeyEvent event, + Set keysPressed, + ) { + final movedLeftFlipper = + _leftFlipperKeys.intersection(keysPressed).isNotEmpty; + if (event is RawKeyDownEvent && movedLeftFlipper) { + leftFlipper.moveUp(); + } else if (event is RawKeyUpEvent && movedLeftFlipper) { + leftFlipper.moveDown(); + } + + final movedRightFlipper = + _rightFlipperKeys.intersection(keysPressed).isNotEmpty; + if (event is RawKeyDownEvent && movedRightFlipper) { + rightFlipper.moveUp(); + } else if (event is RawKeyUpEvent && movedRightFlipper) { + rightFlipper.moveDown(); + } + + return movedLeftFlipper || movedRightFlipper + ? KeyEventResult.handled + : KeyEventResult.ignored; + } } diff --git a/packages/pinball_components/sandbox/lib/stories/flipper/tracing.dart b/packages/pinball_components/sandbox/lib/stories/flipper/tracing.dart index d6c5d3df..778b235b 100644 --- a/packages/pinball_components/sandbox/lib/stories/flipper/tracing.dart +++ b/packages/pinball_components/sandbox/lib/stories/flipper/tracing.dart @@ -4,9 +4,9 @@ import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/material.dart'; import 'package:pinball_components/pinball_components.dart'; -import 'package:sandbox/common/common.dart'; +import 'package:sandbox/stories/flipper/basic.dart'; -class FlipperTracingGame extends BasicGame { +class FlipperTracingGame extends BasicFlipperGame { static const info = ''' Basic example of how the Flipper body overlays the sprite. '''; @@ -14,17 +14,6 @@ class FlipperTracingGame extends BasicGame { @override Future onLoad() async { await super.onLoad(); - final center = screenToWorld(camera.viewport.canvasSize! / 2); - - final leftFlipper = Flipper(side: BoardSide.left) - ..initialPosition = center - Vector2(Flipper.size.x, 0); - final rightFlipper = Flipper(side: BoardSide.right) - ..initialPosition = center + Vector2(Flipper.size.x, 0); - - await addAll([ - leftFlipper, - rightFlipper, - ]); leftFlipper.trace(); rightFlipper.trace(); } @@ -37,7 +26,6 @@ extension on BodyComponent { body.joints.whereType().forEach( (joint) => joint.setLimits(0, 0), ); - body.setType(BodyType.static); unawaited( mounted.whenComplete(() {