From ebdaaf953dc3486b997d7bf16ab3d027f41a4fba Mon Sep 17 00:00:00 2001 From: alestiago Date: Wed, 4 May 2022 23:16:37 +0100 Subject: [PATCH] feat: implemented layer_filtering_behavior --- .../lib/src/components/components.dart | 2 +- .../layer_sensor/behaviors/behaviors.dart | 2 + .../behaviors/layer_filtering_behavior.dart | 31 ++++++++++ .../{ => layer_sensor}/layer_sensor.dart | 57 ++++++------------- 4 files changed, 52 insertions(+), 40 deletions(-) create mode 100644 packages/pinball_components/lib/src/components/layer_sensor/behaviors/behaviors.dart create mode 100644 packages/pinball_components/lib/src/components/layer_sensor/behaviors/layer_filtering_behavior.dart rename packages/pinball_components/lib/src/components/{ => layer_sensor}/layer_sensor.dart (52%) diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index d3d4253b..6a724334 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -22,7 +22,7 @@ export 'joint_anchor.dart'; export 'kicker/kicker.dart'; export 'launch_ramp.dart'; export 'layer.dart'; -export 'layer_sensor.dart'; +export 'layer_sensor/layer_sensor.dart'; export 'multiball/multiball.dart'; export 'multiplier/multiplier.dart'; export 'plunger.dart'; diff --git a/packages/pinball_components/lib/src/components/layer_sensor/behaviors/behaviors.dart b/packages/pinball_components/lib/src/components/layer_sensor/behaviors/behaviors.dart new file mode 100644 index 00000000..060e313d --- /dev/null +++ b/packages/pinball_components/lib/src/components/layer_sensor/behaviors/behaviors.dart @@ -0,0 +1,2 @@ +export 'behaviors.dart'; +export 'layer_filtering_behavior.dart'; diff --git a/packages/pinball_components/lib/src/components/layer_sensor/behaviors/layer_filtering_behavior.dart b/packages/pinball_components/lib/src/components/layer_sensor/behaviors/layer_filtering_behavior.dart new file mode 100644 index 00000000..06dca4b6 --- /dev/null +++ b/packages/pinball_components/lib/src/components/layer_sensor/behaviors/layer_filtering_behavior.dart @@ -0,0 +1,31 @@ +// ignore_for_file: public_member_api_docs + +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +class LayerFilteringBehavior extends ContactBehavior { + @override + void beginContact(Object other, Contact contact) { + super.beginContact(other, contact); + if (other is! Ball) return; + + if (other.layer != parent.insideLayer) { + final isBallEnteringOpening = + (parent.orientation == LayerEntranceOrientation.down && + other.body.linearVelocity.y < 0) || + (parent.orientation == LayerEntranceOrientation.up && + other.body.linearVelocity.y > 0); + + if (isBallEnteringOpening) { + other + ..layer = parent.insideLayer + ..zIndex = parent.insideZIndex; + } + } else { + other + ..layer = parent.outsideLayer + ..zIndex = parent.outsideZIndex; + } + } +} diff --git a/packages/pinball_components/lib/src/components/layer_sensor.dart b/packages/pinball_components/lib/src/components/layer_sensor/layer_sensor.dart similarity index 52% rename from packages/pinball_components/lib/src/components/layer_sensor.dart rename to packages/pinball_components/lib/src/components/layer_sensor/layer_sensor.dart index 6b5f3832..f90ffd79 100644 --- a/packages/pinball_components/lib/src/components/layer_sensor.dart +++ b/packages/pinball_components/lib/src/components/layer_sensor/layer_sensor.dart @@ -1,7 +1,8 @@ -// ignore_for_file: avoid_renaming_method_parameters +// ignore_for_file: avoid_renaming_method_parameters, public_member_api_docs import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/layer_sensor/behaviors/layer_filtering_behavior.dart'; /// {@template layer_entrance_orientation} /// Determines if a layer entrance is oriented [up] or [down] on the board. @@ -18,29 +19,33 @@ enum LayerEntranceOrientation { /// [BodyComponent] located at the entrance and exit of a [Layer]. /// /// By default the base [layer] is set to [Layer.board] and the -/// [_outsideZIndex] is set to [ZIndexes.ballOnBoard]. +/// [outsideZIndex] is set to [ZIndexes.ballOnBoard]. /// {@endtemplate} abstract class LayerSensor extends BodyComponent with InitialPosition, Layered, ContactCallbacks { /// {@macro layer_sensor} LayerSensor({ - required Layer insideLayer, + required this.insideLayer, Layer? outsideLayer, - required int insideZIndex, + required this.insideZIndex, int? outsideZIndex, required this.orientation, - }) : _insideLayer = insideLayer, - _outsideLayer = outsideLayer ?? Layer.board, - _insideZIndex = insideZIndex, - _outsideZIndex = outsideZIndex ?? ZIndexes.ballOnBoard, - super(renderBody: false) { + }) : outsideLayer = outsideLayer ?? Layer.board, + outsideZIndex = outsideZIndex ?? ZIndexes.ballOnBoard, + super( + renderBody: false, + children: [LayerFilteringBehavior()], + ) { layer = Layer.opening; } - final Layer _insideLayer; - final Layer _outsideLayer; - final int _insideZIndex; - final int _outsideZIndex; + final Layer insideLayer; + + final Layer outsideLayer; + + final int insideZIndex; + + final int outsideZIndex; /// The [Shape] of the [LayerSensor]. Shape get shape; @@ -58,33 +63,7 @@ abstract class LayerSensor extends BodyComponent ); final bodyDef = BodyDef( position: initialPosition, - userData: this, ); - return world.createBody(bodyDef)..createFixture(fixtureDef); } - - @override - void beginContact(Object other, Contact contact) { - super.beginContact(other, contact); - if (other is! Ball) return; - - if (other.layer != _insideLayer) { - final isBallEnteringOpening = - (orientation == LayerEntranceOrientation.down && - other.body.linearVelocity.y < 0) || - (orientation == LayerEntranceOrientation.up && - other.body.linearVelocity.y > 0); - - if (isBallEnteringOpening) { - other - ..layer = _insideLayer - ..zIndex = _insideZIndex; - } - } else { - other - ..layer = _outsideLayer - ..zIndex = _outsideZIndex; - } - } }