diff --git a/lib/game/components/plunger.dart b/lib/game/components/plunger.dart index 4dd4285a..2ec2f599 100644 --- a/lib/game/components/plunger.dart +++ b/lib/game/components/plunger.dart @@ -11,13 +11,16 @@ import 'package:pinball/game/game.dart' show Anchor; /// {@endtemplate} class Plunger extends BodyComponent with KeyboardHandler { /// {@macro plunger} - Plunger({required Vector2 position}) : _position = position; + Plunger({ + required Vector2 position, + required this.compressionDistance, + }) : _position = position; /// The initial position of the [Plunger] body. final Vector2 _position; /// Distance the plunger can lower. - static const compressionDistance = 120.0; + final double compressionDistance; @override Body createBody() { @@ -83,7 +86,7 @@ class PlungerAnchor extends Anchor { }) : super( position: Vector2( plunger.body.position.x, - plunger.body.position.y - Plunger.compressionDistance, + plunger.body.position.y - plunger.compressionDistance, ), ); } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index a6babd18..35de10f7 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -15,18 +15,6 @@ class PinballGame extends Forge2DGame late final Plunger plunger; - // TODO(erickzanardo): Change to the plumber position - late final ballStartingPosition = screenToWorld( - Vector2( - camera.viewport.effectiveSize.x / 2, - camera.viewport.effectiveSize.y - 20, - ), - ) - - Vector2(0, -20); - - // TODO(alestiago): Change to the design position. - late final flippersPosition = ballStartingPosition - Vector2(0, 5); - @override void onAttach() { super.onAttach(); @@ -80,7 +68,7 @@ class PinballGame extends Forge2DGame final flippersPosition = screenToWorld( Vector2( camera.viewport.effectiveSize.x / 2, - camera.viewport.effectiveSize.y - 120, + camera.viewport.effectiveSize.y / 1.1, ), ); const spaceBetweenFlippers = 2; @@ -144,15 +132,17 @@ class PinballGame extends Forge2DGame Future _addPlunger() async { late PlungerAnchor plungerAnchor; + final compressionDistance = camera.viewport.effectiveSize.y / 12; await add( plunger = Plunger( position: screenToWorld( Vector2( - camera.viewport.effectiveSize.x - 30, - camera.viewport.effectiveSize.y - Plunger.compressionDistance, + camera.viewport.effectiveSize.x / 1.035, + camera.viewport.effectiveSize.y - compressionDistance, ), ), + compressionDistance: compressionDistance, ), ); await add(plungerAnchor = PlungerAnchor(plunger: plunger)); diff --git a/test/game/components/plunger_test.dart b/test/game/components/plunger_test.dart index 33c70988..0ed550b2 100644 --- a/test/game/components/plunger_test.dart +++ b/test/game/components/plunger_test.dart @@ -16,11 +16,16 @@ void main() { final flameTester = FlameTester(PinballGameX.initial); group('Plunger', () { + const compressionDistance = 0.0; + flameTester.test( 'loads correctly', (game) async { await game.ready(); - final plunger = Plunger(position: Vector2.zero()); + final plunger = Plunger( + position: Vector2.zero(), + compressionDistance: compressionDistance, + ); await game.ensureAdd(plunger); expect(game.contains(plunger), isTrue); @@ -32,7 +37,10 @@ void main() { 'positions correctly', (game) async { final position = Vector2.all(10); - final plunger = Plunger(position: position); + final plunger = Plunger( + position: position, + compressionDistance: compressionDistance, + ); await game.ensureAdd(plunger); game.contains(plunger); @@ -43,7 +51,10 @@ void main() { flameTester.test( 'is dynamic', (game) async { - final plunger = Plunger(position: Vector2.zero()); + final plunger = Plunger( + position: Vector2.zero(), + compressionDistance: compressionDistance, + ); await game.ensureAdd(plunger); expect(plunger.body.bodyType, equals(BodyType.dynamic)); @@ -53,7 +64,10 @@ void main() { flameTester.test( 'ignores gravity', (game) async { - final plunger = Plunger(position: Vector2.zero()); + final plunger = Plunger( + position: Vector2.zero(), + compressionDistance: compressionDistance, + ); await game.ensureAdd(plunger); expect(plunger.body.gravityScale, isZero); @@ -65,7 +79,10 @@ void main() { flameTester.test( 'exists', (game) async { - final plunger = Plunger(position: Vector2.zero()); + final plunger = Plunger( + position: Vector2.zero(), + compressionDistance: compressionDistance, + ); await game.ensureAdd(plunger); expect(plunger.body.fixtures[0], isA()); @@ -75,7 +92,10 @@ void main() { flameTester.test( 'shape is a polygon', (game) async { - final plunger = Plunger(position: Vector2.zero()); + final plunger = Plunger( + position: Vector2.zero(), + compressionDistance: compressionDistance, + ); await game.ensureAdd(plunger); final fixture = plunger.body.fixtures[0]; @@ -86,7 +106,10 @@ void main() { flameTester.test( 'has density', (game) async { - final plunger = Plunger(position: Vector2.zero()); + final plunger = Plunger( + position: Vector2.zero(), + compressionDistance: compressionDistance, + ); await game.ensureAdd(plunger); final fixture = plunger.body.fixtures[0]; @@ -105,7 +128,10 @@ void main() { late Plunger plunger; setUp(() { - plunger = Plunger(position: Vector2.zero()); + plunger = Plunger( + position: Vector2.zero(), + compressionDistance: compressionDistance, + ); }); testRawKeyUpEvents(keys, (event) { @@ -162,10 +188,15 @@ void main() { }); group('PlungerAnchor', () { + const compressionDistance = 10.0; + flameTester.test( 'position is a compression distance below the Plunger', (game) async { - final plunger = Plunger(position: Vector2.zero()); + final plunger = Plunger( + position: Vector2.zero(), + compressionDistance: compressionDistance, + ); await game.ensureAdd(plunger); final plungerAnchor = PlungerAnchor(plunger: plunger); @@ -173,16 +204,16 @@ void main() { expect( plungerAnchor.body.position.y, - equals(plunger.body.position.y - Plunger.compressionDistance), + equals(plunger.body.position.y - compressionDistance), ); }, ); }); group('PlungerAnchorPrismaticJointDef', () { - late Plunger plunger; - + const compressionDistance = 10.0; final gameBloc = MockGameBloc(); + late Plunger plunger; setUp(() { whenListen( @@ -190,7 +221,10 @@ void main() { const Stream.empty(), initialState: const GameState.initial(), ); - plunger = Plunger(position: Vector2.zero()); + plunger = Plunger( + position: Vector2.zero(), + compressionDistance: compressionDistance, + ); }); final flameTester = flameBlocTester(gameBloc: gameBloc);