From 9caa2ee225f1c3aaea37a317aa0d2c83c43c0b75 Mon Sep 17 00:00:00 2001 From: alestiago Date: Tue, 5 Apr 2022 17:19:44 +0100 Subject: [PATCH] refactor: added kicker asset and fixed dimensions and sizes --- lib/game/components/board.dart | 4 +- .../assets/images/kicker/left.png | Bin 0 -> 14253 bytes .../assets/images/kicker/right.png | Bin 0 -> 13917 bytes .../lib/gen/assets.gen.dart | 59 ++++++++++++++++++ .../lib/src/components/kicker.dart | 50 ++++++++++----- packages/pinball_components/pubspec.yaml | 1 + 6 files changed, 95 insertions(+), 19 deletions(-) create mode 100644 packages/pinball_components/assets/images/kicker/left.png create mode 100644 packages/pinball_components/assets/images/kicker/right.png diff --git a/lib/game/components/board.dart b/lib/game/components/board.dart index 49595f10..a312daee 100644 --- a/lib/game/components/board.dart +++ b/lib/game/components/board.dart @@ -83,8 +83,8 @@ class _BottomGroupSide extends Component { final kicker = Kicker( side: _side, )..initialPosition = Vector2( - (22.0 * direction) + centerXAdjustment, - -26, + (22.4 * direction) + centerXAdjustment, + -25, ); await addAll([flipper, baseboard, kicker]); diff --git a/packages/pinball_components/assets/images/kicker/left.png b/packages/pinball_components/assets/images/kicker/left.png new file mode 100644 index 0000000000000000000000000000000000000000..42bd5030e8b4acf1d86d9f8fd2839e2744feac18 GIT binary patch literal 14253 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 const AssetGenImage('assets/images/ball.png'); + $AssetsImagesBaseboardGen get baseboard => const $AssetsImagesBaseboardGen(); $AssetsImagesBoundaryGen get boundary => const $AssetsImagesBoundaryGen(); $AssetsImagesChromeDinoGen get chromeDino => @@ -17,8 +21,12 @@ class $AssetsImagesGen { const $AssetsImagesDashBumperGen(); $AssetsImagesDinoGen get dino => const $AssetsImagesDinoGen(); $AssetsImagesFlipperGen get flipper => const $AssetsImagesFlipperGen(); + + /// File path: assets/images/flutter_sign_post.png AssetGenImage get flutterSignPost => const AssetGenImage('assets/images/flutter_sign_post.png'); + + $AssetsImagesKickerGen get kicker => const $AssetsImagesKickerGen(); $AssetsImagesLaunchRampGen get launchRamp => const $AssetsImagesLaunchRampGen(); $AssetsImagesSpaceshipGen get spaceship => const $AssetsImagesSpaceshipGen(); @@ -27,8 +35,11 @@ class $AssetsImagesGen { class $AssetsImagesBaseboardGen { const $AssetsImagesBaseboardGen(); + /// File path: assets/images/baseboard/left.png AssetGenImage get left => const AssetGenImage('assets/images/baseboard/left.png'); + + /// File path: assets/images/baseboard/right.png AssetGenImage get right => const AssetGenImage('assets/images/baseboard/right.png'); } @@ -36,8 +47,11 @@ class $AssetsImagesBaseboardGen { class $AssetsImagesBoundaryGen { const $AssetsImagesBoundaryGen(); + /// File path: assets/images/boundary/bottom.png AssetGenImage get bottom => const AssetGenImage('assets/images/boundary/bottom.png'); + + /// File path: assets/images/boundary/outer.png AssetGenImage get outer => const AssetGenImage('assets/images/boundary/outer.png'); } @@ -45,8 +59,11 @@ class $AssetsImagesBoundaryGen { class $AssetsImagesChromeDinoGen { const $AssetsImagesChromeDinoGen(); + /// File path: assets/images/chrome_dino/head.png AssetGenImage get head => const AssetGenImage('assets/images/chrome_dino/head.png'); + + /// File path: assets/images/chrome_dino/mouth.png AssetGenImage get mouth => const AssetGenImage('assets/images/chrome_dino/mouth.png'); } @@ -63,8 +80,11 @@ class $AssetsImagesDashBumperGen { class $AssetsImagesDinoGen { const $AssetsImagesDinoGen(); + /// File path: assets/images/dino/dino-land-bottom.png AssetGenImage get dinoLandBottom => const AssetGenImage('assets/images/dino/dino-land-bottom.png'); + + /// File path: assets/images/dino/dino-land-top.png AssetGenImage get dinoLandTop => const AssetGenImage('assets/images/dino/dino-land-top.png'); } @@ -72,17 +92,35 @@ class $AssetsImagesDinoGen { class $AssetsImagesFlipperGen { const $AssetsImagesFlipperGen(); + /// File path: assets/images/flipper/left.png AssetGenImage get left => const AssetGenImage('assets/images/flipper/left.png'); + + /// File path: assets/images/flipper/right.png AssetGenImage get right => const AssetGenImage('assets/images/flipper/right.png'); } +class $AssetsImagesKickerGen { + const $AssetsImagesKickerGen(); + + /// File path: assets/images/kicker/left.png + AssetGenImage get left => + const AssetGenImage('assets/images/kicker/left.png'); + + /// File path: assets/images/kicker/right.png + AssetGenImage get right => + const AssetGenImage('assets/images/kicker/right.png'); +} + class $AssetsImagesLaunchRampGen { const $AssetsImagesLaunchRampGen(); + /// File path: assets/images/launch_ramp/foreground-railing.png AssetGenImage get foregroundRailing => const AssetGenImage('assets/images/launch_ramp/foreground-railing.png'); + + /// File path: assets/images/launch_ramp/ramp.png AssetGenImage get ramp => const AssetGenImage('assets/images/launch_ramp/ramp.png'); } @@ -90,12 +128,16 @@ class $AssetsImagesLaunchRampGen { class $AssetsImagesSpaceshipGen { const $AssetsImagesSpaceshipGen(); + /// File path: assets/images/spaceship/bridge.png AssetGenImage get bridge => const AssetGenImage('assets/images/spaceship/bridge.png'); + $AssetsImagesSpaceshipRailGen get rail => const $AssetsImagesSpaceshipRailGen(); $AssetsImagesSpaceshipRampGen get ramp => const $AssetsImagesSpaceshipRampGen(); + + /// File path: assets/images/spaceship/saucer.png AssetGenImage get saucer => const AssetGenImage('assets/images/spaceship/saucer.png'); } @@ -103,8 +145,11 @@ class $AssetsImagesSpaceshipGen { class $AssetsImagesDashBumperAGen { const $AssetsImagesDashBumperAGen(); + /// File path: assets/images/dash_bumper/a/active.png AssetGenImage get active => const AssetGenImage('assets/images/dash_bumper/a/active.png'); + + /// File path: assets/images/dash_bumper/a/inactive.png AssetGenImage get inactive => const AssetGenImage('assets/images/dash_bumper/a/inactive.png'); } @@ -112,8 +157,11 @@ class $AssetsImagesDashBumperAGen { class $AssetsImagesDashBumperBGen { const $AssetsImagesDashBumperBGen(); + /// File path: assets/images/dash_bumper/b/active.png AssetGenImage get active => const AssetGenImage('assets/images/dash_bumper/b/active.png'); + + /// File path: assets/images/dash_bumper/b/inactive.png AssetGenImage get inactive => const AssetGenImage('assets/images/dash_bumper/b/inactive.png'); } @@ -121,8 +169,11 @@ class $AssetsImagesDashBumperBGen { class $AssetsImagesDashBumperMainGen { const $AssetsImagesDashBumperMainGen(); + /// File path: assets/images/dash_bumper/main/active.png AssetGenImage get active => const AssetGenImage('assets/images/dash_bumper/main/active.png'); + + /// File path: assets/images/dash_bumper/main/inactive.png AssetGenImage get inactive => const AssetGenImage('assets/images/dash_bumper/main/inactive.png'); } @@ -130,8 +181,11 @@ class $AssetsImagesDashBumperMainGen { class $AssetsImagesSpaceshipRailGen { const $AssetsImagesSpaceshipRailGen(); + /// File path: assets/images/spaceship/rail/foreground.png AssetGenImage get foreground => const AssetGenImage('assets/images/spaceship/rail/foreground.png'); + + /// File path: assets/images/spaceship/rail/main.png AssetGenImage get main => const AssetGenImage('assets/images/spaceship/rail/main.png'); } @@ -139,10 +193,15 @@ class $AssetsImagesSpaceshipRailGen { class $AssetsImagesSpaceshipRampGen { const $AssetsImagesSpaceshipRampGen(); + /// File path: assets/images/spaceship/ramp/main.png AssetGenImage get main => const AssetGenImage('assets/images/spaceship/ramp/main.png'); + + /// File path: assets/images/spaceship/ramp/railing-background.png AssetGenImage get railingBackground => const AssetGenImage( 'assets/images/spaceship/ramp/railing-background.png'); + + /// File path: assets/images/spaceship/ramp/railing-foreground.png AssetGenImage get railingForeground => const AssetGenImage( 'assets/images/spaceship/ramp/railing-foreground.png'); } diff --git a/packages/pinball_components/lib/src/components/kicker.dart b/packages/pinball_components/lib/src/components/kicker.dart index d9eb7932..297fca17 100644 --- a/packages/pinball_components/lib/src/components/kicker.dart +++ b/packages/pinball_components/lib/src/components/kicker.dart @@ -1,10 +1,10 @@ import 'dart:math' as math; -import 'package:flame/extensions.dart'; +import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:flutter/material.dart'; import 'package:geometry/geometry.dart' as geometry show centroid; -import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/gen/assets.gen.dart'; +import 'package:pinball_components/pinball_components.dart' hide Assets; /// {@template kicker} /// Triangular [BodyType.static] body that propels the [Ball] towards the @@ -16,12 +16,7 @@ class Kicker extends BodyComponent with InitialPosition { /// {@macro kicker} Kicker({ required BoardSide side, - }) : _side = side { - // TODO(alestiago): Use sprite instead of color when provided. - paint = Paint() - ..color = const Color(0xFF00FF00) - ..style = PaintingStyle.fill; - } + }) : _side = side; /// Whether the [Kicker] is on the left or right side of the board. /// @@ -31,24 +26,22 @@ class Kicker extends BodyComponent with InitialPosition { final BoardSide _side; /// The size of the [Kicker] body. - // TODO(alestiago): Use size from PositionedBodyComponent instead, - // once a sprite is given. - static final Vector2 size = Vector2(4, 10); + static final Vector2 size = Vector2(4.4, 15); List _createFixtureDefs() { final fixturesDefs = []; final direction = _side.direction; const quarterPi = math.pi / 4; - final upperCircle = CircleShape()..radius = 1.45; + final upperCircle = CircleShape()..radius = 1.6; upperCircle.position.setValues(0, -upperCircle.radius / 2); final upperCircleFixtureDef = FixtureDef(upperCircle)..friction = 0; fixturesDefs.add(upperCircleFixtureDef); - final lowerCircle = CircleShape()..radius = 1.45; + final lowerCircle = CircleShape()..radius = 1.6; lowerCircle.position.setValues( size.x * -direction, - -size.y, + -size.y - 0.8, ); final lowerCircleFixtureDef = FixtureDef(lowerCircle)..friction = 0; fixturesDefs.add(lowerCircleFixtureDef); @@ -60,8 +53,7 @@ class Kicker extends BodyComponent with InitialPosition { upperCircle.radius * direction, 0, ), - // TODO(alestiago): Use values from design. - Vector2(2.0 * direction, -size.y + 2), + Vector2(2.5 * direction, -size.y + 2), ); final wallFacingLineFixtureDef = FixtureDef(wallFacingEdge)..friction = 0; fixturesDefs.add(wallFacingLineFixtureDef); @@ -125,6 +117,30 @@ class Kicker extends BodyComponent with InitialPosition { return body; } + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprite(); + renderBody = false; + } + + Future _loadSprite() async { + final sprite = await gameRef.loadSprite( + (_side.isLeft) + ? Assets.images.kicker.left.keyName + : Assets.images.kicker.right.keyName, + ); + + await add( + SpriteComponent( + sprite: sprite, + size: Vector2(8.7, 19), + anchor: Anchor.center, + position: Vector2(0.7 * -_side.direction, -2.2), + ), + ); + } } // TODO(alestiago): Evaluate if there's value on generalising this to diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index 0e5eb37a..c7302d0d 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -38,6 +38,7 @@ flutter: - assets/images/spaceship/rail/ - assets/images/spaceship/ramp/ - assets/images/chrome_dino/ + - assets/images/kicker/ flutter_gen: line_length: 80