From 7dcde691d1738ff43b8c065da839d46f4b89b953 Mon Sep 17 00:00:00 2001 From: alestiago Date: Thu, 21 Apr 2022 17:14:24 +0100 Subject: [PATCH] refactor: moved Sensor to ControlledSparkyComputer --- .../controlled_sparky_computer.dart | 53 ++++---------- .../lib/src/components/sparky_computer.dart | 72 +++++++++++-------- .../src/components/sparky_computer_test.dart | 2 + test/helpers/mocks.dart | 4 +- 4 files changed, 57 insertions(+), 74 deletions(-) diff --git a/lib/game/components/controlled_sparky_computer.dart b/lib/game/components/controlled_sparky_computer.dart index 7a5dc549..46762fd3 100644 --- a/lib/game/components/controlled_sparky_computer.dart +++ b/lib/game/components/controlled_sparky_computer.dart @@ -1,5 +1,6 @@ // ignore_for_file: avoid_renaming_method_parameters +import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/material.dart'; import 'package:pinball/game/game.dart'; @@ -10,16 +11,17 @@ import 'package:pinball_flame/pinball_flame.dart'; /// [SparkyComputer] with a [SparkyComputerController] attached. /// {@endtemplate} class ControlledSparkyComputer extends SparkyComputer - with Controls { + with Controls, HasGameRef { /// {@macro controlled_sparky_computer} - ControlledSparkyComputer() - : super( - components: [ - SparkyTurboChargeSensor()..initialPosition = Vector2(-13, -49.8) - ], - ) { + ControlledSparkyComputer() : super() { controller = SparkyComputerController(this); } + + @override + Future onLoad() async { + await super.onLoad(); + gameRef.addContactCallback(SparkyTurboChargeSensorBallContactCallback()); + } } /// {@template sparky_computer_controller} @@ -34,49 +36,18 @@ class SparkyComputerController : super(controlledComputer); } -/// {@template sparky_turbo_charge_sensor} -/// Small sensor body used to detect when a ball has entered the -/// [SparkyComputer] with the [SparkyTurboChargeSensorBallContactCallback]. -/// {@endtemplate} -@visibleForTesting -class SparkyTurboChargeSensor extends BodyComponent with InitialPosition { - /// {@macro sparky_turbo_charge_sensor} - SparkyTurboChargeSensor() { - renderBody = false; - } - - @override - Body createBody() { - final shape = CircleShape()..radius = 0.1; - - final fixtureDef = FixtureDef(shape)..isSensor = true; - - final bodyDef = BodyDef() - ..position = initialPosition - ..userData = this; - - return world.createBody(bodyDef)..createFixture(fixtureDef); - } - - @override - Future onLoad() async { - await super.onLoad(); - gameRef.addContactCallback(SparkyTurboChargeSensorBallContactCallback()); - } -} - /// {@template sparky_turbo_charge_sensor_ball_contact_callback} -/// Turbo charges the [Ball] on contact with [SparkyTurboChargeSensor]. +/// Turbo charges the [Ball] when it enters the [SparkyComputer]. /// {@endtemplate} @visibleForTesting class SparkyTurboChargeSensorBallContactCallback - extends ContactCallback { + extends ContactCallback { /// {@macro sparky_turbo_charge_sensor_ball_contact_callback} SparkyTurboChargeSensorBallContactCallback(); @override void begin( - SparkyTurboChargeSensor sparkyTurboChargeSensor, + SparkyComputerSensor sparkyTurboChargeSensor, ControlledBall ball, _, ) { diff --git a/packages/pinball_components/lib/src/components/sparky_computer.dart b/packages/pinball_components/lib/src/components/sparky_computer.dart index f75f8356..76bb83ae 100644 --- a/packages/pinball_components/lib/src/components/sparky_computer.dart +++ b/packages/pinball_components/lib/src/components/sparky_computer.dart @@ -6,75 +6,64 @@ import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; /// {@template sparky_computer} -/// A [Blueprint] which creates the [_ComputerBase] and -/// [_ComputerTopSpriteComponent]. +/// A computer owned by Sparky. +/// +/// Register a [ContactCallback] for [SparkyComputerSensor] to listen when +/// something enters the [SparkyComputer]. /// {@endtemplate} class SparkyComputer extends Blueprint { /// {@macro sparky_computer} - SparkyComputer({ - Iterable? components, - }) : super( + SparkyComputer() + : super( components: [ _ComputerBase(), _ComputerTopSpriteComponent(), - if (components != null) ...components, + SparkyComputerSensor(), ], ); } class _ComputerBase extends BodyComponent with InitialPosition { - _ComputerBase() : super(priority: RenderPriority.computerBase); + _ComputerBase() + : super( + priority: RenderPriority.computerBase, + children: [_ComputerBaseSpriteComponent()], + ) { + renderBody = false; + } List _createFixtureDefs() { - final fixturesDef = []; - final leftEdge = EdgeShape() ..set( Vector2(-14.9, -46), Vector2(-15.3, -49.6), ); - final leftEdgeFixtureDef = FixtureDef(leftEdge); - fixturesDef.add(leftEdgeFixtureDef); - final topEdge = EdgeShape() ..set( Vector2(-15.3, -49.6), Vector2(-10.7, -50.6), ); - final topEdgeFixtureDef = FixtureDef(topEdge); - fixturesDef.add(topEdgeFixtureDef); - final rightEdge = EdgeShape() ..set( Vector2(-10.7, -50.6), Vector2(-9, -47.2), ); - final rightEdgeFixtureDef = FixtureDef(rightEdge); - fixturesDef.add(rightEdgeFixtureDef); - return fixturesDef; + return [ + FixtureDef(leftEdge), + FixtureDef(topEdge), + FixtureDef(rightEdge), + ]; } @override Body createBody() { - final bodyDef = BodyDef( - position: initialPosition, - userData: this, - ); - + final bodyDef = BodyDef(position: initialPosition); final body = world.createBody(bodyDef); _createFixtureDefs().forEach(body.createFixture); return body; } - - @override - Future onLoad() async { - await super.onLoad(); - renderBody = false; - - await add(_ComputerBaseSpriteComponent()); - } } class _ComputerBaseSpriteComponent extends SpriteComponent with HasGameRef { @@ -115,3 +104,24 @@ class _ComputerTopSpriteComponent extends SpriteComponent with HasGameRef { size = sprite.originalSize / 10; } } + +/// {@template sparky_turbo_charge_sensor} +/// Small sensor body used to detect when a ball has entered the +/// [SparkyComputer]. +/// {@endtemplate} +class SparkyComputerSensor extends BodyComponent with InitialPosition { + /// {@macro sparky_turbo_charge_sensor} + SparkyComputerSensor() { + renderBody = false; + } + + @override + Body createBody() { + final shape = CircleShape()..radius = 0.1; + final fixtureDef = FixtureDef(shape, isSensor: true); + final bodyDef = BodyDef() + ..position = initialPosition + ..userData = this; + return world.createBody(bodyDef)..createFixture(fixtureDef); + } +} diff --git a/packages/pinball_components/test/src/components/sparky_computer_test.dart b/packages/pinball_components/test/src/components/sparky_computer_test.dart index 3d67106d..6b19481e 100644 --- a/packages/pinball_components/test/src/components/sparky_computer_test.dart +++ b/packages/pinball_components/test/src/components/sparky_computer_test.dart @@ -16,6 +16,8 @@ void main() { 'renders correctly', setUp: (game, tester) async { await game.addFromBlueprint(SparkyComputer()); + await game.ready(); + game.camera.followVector2(Vector2(-15, -50)); }, verify: (game, tester) async { diff --git a/test/helpers/mocks.dart b/test/helpers/mocks.dart index e9af4408..663a6505 100644 --- a/test/helpers/mocks.dart +++ b/test/helpers/mocks.dart @@ -69,8 +69,8 @@ class MockDashNestBumper extends Mock implements DashNestBumper {} class MockPinballAudio extends Mock implements PinballAudio {} -class MockSparkyTurboChargeSensor extends Mock - implements SparkyTurboChargeSensor {} +class MockSparkyTurboChargeSensor extends Mock implements SparkyComputerSensor { +} class MockAssetsManagerCubit extends Mock implements AssetsManagerCubit {}