diff --git a/assets/images/components/baseboards/left-baseboard.png b/assets/images/components/baseboards/left-baseboard.png new file mode 100644 index 00000000..17253554 Binary files /dev/null and b/assets/images/components/baseboards/left-baseboard.png differ diff --git a/assets/images/components/baseboards/right-baseboard.png b/assets/images/components/baseboards/right-baseboard.png new file mode 100644 index 00000000..081a1782 Binary files /dev/null and b/assets/images/components/baseboards/right-baseboard.png differ diff --git a/lib/game/components/baseboard.dart b/lib/game/components/baseboard.dart index d4c326e3..70b5deed 100644 --- a/lib/game/components/baseboard.dart +++ b/lib/game/components/baseboard.dart @@ -1,8 +1,10 @@ import 'dart:math' as math; +import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:pinball/game/game.dart'; -import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball/gen/assets.gen.dart'; +import 'package:pinball_components/pinball_components.dart' hide Assets; /// {@template baseboard} /// Wing-shaped board piece to corral the [Ball] towards the [Flipper]s. @@ -14,7 +16,7 @@ class Baseboard extends BodyComponent with InitialPosition { }) : _side = side; /// The size of the [Baseboard]. - static final size = Vector2(24.2, 13.5); + static final size = Vector2(24.79, 15.5); /// Whether the [Baseboard] is on the left or right side of the board. final BoardSide _side; @@ -25,50 +27,55 @@ class Baseboard extends BodyComponent with InitialPosition { final arcsAngle = -1.11 * direction; const arcsRotation = math.pi / 2.08; + final pegBumperShape = CircleShape()..radius = 0.7; + pegBumperShape.position.setValues(11.11 * direction, 7.15); + final pegBumperFixtureDef = FixtureDef(pegBumperShape); + fixturesDef.add(pegBumperFixtureDef); + final topCircleShape = CircleShape()..radius = 0.7; - topCircleShape.position.setValues(11.39 * direction, 6.05); + topCircleShape.position.setValues(9.71 * direction, 4.95); final topCircleFixtureDef = FixtureDef(topCircleShape); fixturesDef.add(topCircleFixtureDef); final innerEdgeShape = EdgeShape() ..set( - Vector2(10.86 * direction, 6.45), - Vector2(6.96 * direction, 0.25), + Vector2(9.01 * direction, 5.35), + Vector2(5.29 * direction, -0.95), ); final innerEdgeShapeFixtureDef = FixtureDef(innerEdgeShape); fixturesDef.add(innerEdgeShapeFixtureDef); final outerEdgeShape = EdgeShape() ..set( - Vector2(11.96 * direction, 5.85), - Vector2(5.48 * direction, -4.85), + Vector2(10.41 * direction, 4.75), + Vector2(3.79 * direction, -5.95), ); final outerEdgeShapeFixtureDef = FixtureDef(outerEdgeShape); fixturesDef.add(outerEdgeShapeFixtureDef); final upperArcShape = ArcShape( - center: Vector2(1.76 * direction, 3.25), + center: Vector2(0.09 * direction, 2.15), arcRadius: 6.1, angle: arcsAngle, rotation: arcsRotation, ); - final upperArcFixtureDefs = FixtureDef(upperArcShape); - fixturesDef.add(upperArcFixtureDefs); + final upperArcFixtureDef = FixtureDef(upperArcShape); + fixturesDef.add(upperArcFixtureDef); final lowerArcShape = ArcShape( - center: Vector2(1.85 * direction, -2.15), + center: Vector2(0.09 * direction, -3.35), arcRadius: 4.5, angle: arcsAngle, rotation: arcsRotation, ); - final lowerArcFixtureDefs = FixtureDef(lowerArcShape); - fixturesDef.add(lowerArcFixtureDefs); + final lowerArcFixtureDef = FixtureDef(lowerArcShape); + fixturesDef.add(lowerArcFixtureDef); final bottomRectangle = PolygonShape() ..setAsBox( 7, 2, - Vector2(-5.14 * direction, -4.75), + Vector2(-6.81 * direction, -5.85), 0, ); final bottomRectangleFixtureDef = FixtureDef(bottomRectangle); @@ -77,11 +84,31 @@ class Baseboard extends BodyComponent with InitialPosition { return fixturesDef; } + @override + Future onLoad() async { + await super.onLoad(); + + final sprite = await gameRef.loadSprite( + (_side.isLeft) + ? Assets.images.components.baseboards.leftBaseboard.path + : Assets.images.components.baseboards.rightBaseboard.path, + ); + + await add( + SpriteComponent( + sprite: sprite, + size: Vector2(27.5, 17.9), + anchor: Anchor.center, + position: Vector2(_side.isLeft ? 0.4 : -0.4, 0), + ), + ); + + renderBody = false; + } + @override Body createBody() { - // TODO(allisonryan0002): share sweeping angle with flipper when components - // are grouped. - const angle = math.pi / 5; + const angle = 0.6475; final bodyDef = BodyDef() ..position = initialPosition diff --git a/lib/game/components/board.dart b/lib/game/components/board.dart index 1f96120e..cc4f1edd 100644 --- a/lib/game/components/board.dart +++ b/lib/game/components/board.dart @@ -6,18 +6,11 @@ import 'package:pinball/game/game.dart'; /// {endtemplate} class Board extends Component { /// {@macro board} - Board(); + Board() : super(priority: 5); @override Future onLoad() async { - // TODO(alestiago): adjust positioning once sprites are added. - final bottomGroup = _BottomGroup( - position: Vector2( - PinballGame.boardBounds.center.dx, - PinballGame.boardBounds.bottom + 10, - ), - spacing: 2, - ); + final bottomGroup = _BottomGroup(); final flutterForest = FlutterForest(); @@ -44,27 +37,15 @@ class Board extends Component { // TODO(alestiago): Consider renaming once entire Board is defined. class _BottomGroup extends Component { /// {@macro bottom_group} - _BottomGroup({ - required this.position, - required this.spacing, - }); - - /// The amount of space between the line of symmetry. - final double spacing; - - /// The position of this [_BottomGroup]. - final Vector2 position; + _BottomGroup(); @override Future onLoad() async { - final spacing = this.spacing + Flipper.size.x / 2; final rightSide = _BottomGroupSide( side: BoardSide.right, - position: position + Vector2(spacing, 0), ); final leftSide = _BottomGroupSide( side: BoardSide.left, - position: position + Vector2(-spacing, 0), ); await addAll([rightSide, leftSide]); @@ -80,34 +61,29 @@ class _BottomGroupSide extends Component { /// {@macro bottom_group_side} _BottomGroupSide({ required BoardSide side, - required Vector2 position, - }) : _side = side, - _position = position; + }) : _side = side; final BoardSide _side; - final Vector2 _position; - @override Future onLoad() async { final direction = _side.direction; + final centerXAdjustment = _side.isLeft ? 0 : -6.5; final flipper = Flipper( side: _side, - )..initialPosition = _position; + )..initialPosition = Vector2((11.0 * direction) + centerXAdjustment, -42.4); final baseboard = Baseboard(side: _side) - ..initialPosition = _position + - Vector2( - (Baseboard.size.x / 1.6 * direction), - Baseboard.size.y - 2, - ); + ..initialPosition = Vector2( + (25.58 * direction) + centerXAdjustment, + -28.69, + ); final kicker = Kicker( side: _side, - )..initialPosition = _position + - Vector2( - (Flipper.size.x) * direction, - Flipper.size.y + Kicker.size.y, - ); + )..initialPosition = Vector2( + (22.0 * direction) + centerXAdjustment, + -26, + ); await addAll([flipper, baseboard, kicker]); } diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index 648532cf..3ef9f9d3 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -10,6 +10,8 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.ball.keyName), images.load(Assets.images.components.flipper.path), images.load(Assets.images.components.background.path), + images.load(Assets.images.components.baseboards.leftBaseboard.path), + images.load(Assets.images.components.baseboards.rightBaseboard.path), images.load(Assets.images.components.spaceship.androidTop.path), images.load(Assets.images.components.spaceship.androidBottom.path), images.load(Assets.images.components.spaceship.lower.path), diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 8c228e16..62c591d1 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -21,6 +21,9 @@ class $AssetsImagesComponentsGen { AssetGenImage get background => const AssetGenImage('assets/images/components/background.png'); + $AssetsImagesComponentsBaseboardsGen get baseboards => + const $AssetsImagesComponentsBaseboardsGen(); + /// File path: assets/images/components/flipper.png AssetGenImage get flipper => const AssetGenImage('assets/images/components/flipper.png'); @@ -29,6 +32,18 @@ class $AssetsImagesComponentsGen { const $AssetsImagesComponentsSpaceshipGen(); } +class $AssetsImagesComponentsBaseboardsGen { + const $AssetsImagesComponentsBaseboardsGen(); + + /// File path: assets/images/components/baseboards/left-baseboard.png + AssetGenImage get leftBaseboard => const AssetGenImage( + 'assets/images/components/baseboards/left-baseboard.png'); + + /// File path: assets/images/components/baseboards/right-baseboard.png + AssetGenImage get rightBaseboard => const AssetGenImage( + 'assets/images/components/baseboards/right-baseboard.png'); +} + class $AssetsImagesComponentsSpaceshipGen { const $AssetsImagesComponentsSpaceshipGen(); diff --git a/pubspec.yaml b/pubspec.yaml index 1efe9281..b37e296e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -43,6 +43,7 @@ flutter: assets: - assets/images/components/ + - assets/images/components/baseboards/ - assets/images/components/spaceship/ flutter_gen: