diff --git a/assets/images/components/spaceship/android-bottom.png b/assets/images/components/spaceship/android-bottom.png deleted file mode 100644 index 90dfdc01..00000000 Binary files a/assets/images/components/spaceship/android-bottom.png and /dev/null differ diff --git a/assets/images/components/spaceship/android-top.png b/assets/images/components/spaceship/android-top.png deleted file mode 100644 index 92c99db7..00000000 Binary files a/assets/images/components/spaceship/android-top.png and /dev/null differ diff --git a/assets/images/components/spaceship/lower.png b/assets/images/components/spaceship/lower.png deleted file mode 100644 index 1f0d9b10..00000000 Binary files a/assets/images/components/spaceship/lower.png and /dev/null differ diff --git a/assets/images/components/spaceship/saucer.png b/assets/images/components/spaceship/saucer.png deleted file mode 100644 index 93af98b5..00000000 Binary files a/assets/images/components/spaceship/saucer.png and /dev/null differ diff --git a/assets/images/components/spaceship/upper.png b/assets/images/components/spaceship/upper.png deleted file mode 100644 index 0e03cec8..00000000 Binary files a/assets/images/components/spaceship/upper.png and /dev/null differ diff --git a/lib/game/components/ball.dart b/lib/game/components/ball.dart index aca2b154..9f6241fd 100644 --- a/lib/game/components/ball.dart +++ b/lib/game/components/ball.dart @@ -1,5 +1,4 @@ import 'package:flame/components.dart'; -import 'package:pinball/flame/blueprint.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart index d02063c9..2a2a8bb8 100644 --- a/lib/game/components/components.dart +++ b/lib/game/components/components.dart @@ -9,7 +9,5 @@ export 'jetpack_ramp.dart'; export 'kicker.dart'; export 'launcher_ramp.dart'; export 'plunger.dart'; -export 'ramp_opening.dart'; export 'score_points.dart'; -export 'spaceship.dart'; export 'wall.dart'; diff --git a/lib/game/components/flutter_forest.dart b/lib/game/components/flutter_forest.dart index 5b91ee40..19fba005 100644 --- a/lib/game/components/flutter_forest.dart +++ b/lib/game/components/flutter_forest.dart @@ -6,7 +6,6 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/material.dart'; -import 'package:pinball/flame/blueprint.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; diff --git a/lib/game/components/jetpack_ramp.dart b/lib/game/components/jetpack_ramp.dart index a24e1438..e5eae883 100644 --- a/lib/game/components/jetpack_ramp.dart +++ b/lib/game/components/jetpack_ramp.dart @@ -5,7 +5,6 @@ import 'dart:math' as math; import 'package:flame/extensions.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/material.dart'; -import 'package:pinball/flame/blueprint.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; diff --git a/lib/game/components/launcher_ramp.dart b/lib/game/components/launcher_ramp.dart index 5313a2d9..b3f3cb23 100644 --- a/lib/game/components/launcher_ramp.dart +++ b/lib/game/components/launcher_ramp.dart @@ -5,7 +5,6 @@ import 'dart:math' as math; import 'package:flame/extensions.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/material.dart'; -import 'package:pinball/flame/blueprint.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index 47e41393..f597a066 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -11,10 +11,6 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.flipper.left.keyName), images.load(components.Assets.images.flipper.right.keyName), images.load(Assets.images.components.background.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), - images.load(Assets.images.components.spaceship.upper.path), ]); } } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 2b794455..4a93da99 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -7,9 +7,9 @@ import 'package:flame/extensions.dart'; import 'package:flame/input.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:pinball/flame/blueprint.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball/gen/assets.gen.dart'; +import 'package:pinball_components/pinball_components.dart' hide Assets; import 'package:pinball_theme/pinball_theme.dart' hide Assets; class PinballGame extends Forge2DGame @@ -46,7 +46,13 @@ class PinballGame extends Forge2DGame unawaited(_addPlunger()); unawaited(_addBonusWord()); unawaited(_addPaths()); - unawaited(addFromBlueprint(Spaceship())); + unawaited( + addFromBlueprint( + Spaceship( + position: Vector2(-25, 32), + ), + ), + ); // Fix camera on the center of the board. camera diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 14f0e632..370d8fcf 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -3,8 +3,6 @@ /// FlutterGen /// ***************************************************** -// ignore_for_file: directives_ordering,unnecessary_import - import 'package:flutter/widgets.dart'; class $AssetsImagesGen { @@ -17,36 +15,8 @@ class $AssetsImagesGen { class $AssetsImagesComponentsGen { const $AssetsImagesComponentsGen(); - /// File path: assets/images/components/background.png AssetGenImage get background => const AssetGenImage('assets/images/components/background.png'); - - $AssetsImagesComponentsSpaceshipGen get spaceship => - const $AssetsImagesComponentsSpaceshipGen(); -} - -class $AssetsImagesComponentsSpaceshipGen { - const $AssetsImagesComponentsSpaceshipGen(); - - /// File path: assets/images/components/spaceship/android-bottom.png - AssetGenImage get androidBottom => const AssetGenImage( - 'assets/images/components/spaceship/android-bottom.png'); - - /// File path: assets/images/components/spaceship/android-top.png - AssetGenImage get androidTop => - const AssetGenImage('assets/images/components/spaceship/android-top.png'); - - /// File path: assets/images/components/spaceship/lower.png - AssetGenImage get lower => - const AssetGenImage('assets/images/components/spaceship/lower.png'); - - /// File path: assets/images/components/spaceship/saucer.png - AssetGenImage get saucer => - const AssetGenImage('assets/images/components/spaceship/saucer.png'); - - /// File path: assets/images/components/spaceship/upper.png - AssetGenImage get upper => - const AssetGenImage('assets/images/components/spaceship/upper.png'); } class Assets { diff --git a/packages/pinball_components/assets/images/spaceship_bridge.png b/packages/pinball_components/assets/images/spaceship_bridge.png new file mode 100644 index 00000000..6ebb143e Binary files /dev/null and b/packages/pinball_components/assets/images/spaceship_bridge.png differ diff --git a/packages/pinball_components/assets/images/spaceship_saucer.png b/packages/pinball_components/assets/images/spaceship_saucer.png new file mode 100644 index 00000000..4cd65522 Binary files /dev/null and b/packages/pinball_components/assets/images/spaceship_saucer.png differ diff --git a/packages/pinball_components/lib/gen/assets.gen.dart b/packages/pinball_components/lib/gen/assets.gen.dart index c61923c3..bbf6a227 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -3,27 +3,24 @@ /// FlutterGen /// ***************************************************** -// ignore_for_file: directives_ordering,unnecessary_import - import 'package:flutter/widgets.dart'; class $AssetsImagesGen { const $AssetsImagesGen(); - /// File path: assets/images/ball.png AssetGenImage get ball => const AssetGenImage('assets/images/ball.png'); - $AssetsImagesFlipperGen get flipper => const $AssetsImagesFlipperGen(); + AssetGenImage get spaceshipBridge => + const AssetGenImage('assets/images/spaceship_bridge.png'); + AssetGenImage get spaceshipSaucer => + const AssetGenImage('assets/images/spaceship_saucer.png'); } 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'); } diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index 185ac25f..e6bc912c 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -5,4 +5,6 @@ export 'flipper.dart'; export 'initial_position.dart'; export 'joint_anchor.dart'; export 'layer.dart'; +export 'ramp_opening.dart'; export 'shapes/shapes.dart'; +export 'spaceship.dart'; diff --git a/lib/game/components/ramp_opening.dart b/packages/pinball_components/lib/src/components/ramp_opening.dart similarity index 94% rename from lib/game/components/ramp_opening.dart rename to packages/pinball_components/lib/src/components/ramp_opening.dart index ee1ecdea..8f33e813 100644 --- a/lib/game/components/ramp_opening.dart +++ b/packages/pinball_components/lib/src/components/ramp_opening.dart @@ -1,17 +1,16 @@ // ignore_for_file: avoid_renaming_method_parameters import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; /// {@template ramp_orientation} -/// Determines if a ramp is facing [up] or [down] on the [Board]. +/// Determines if a ramp is facing [up] or [down] on the Board. /// {@endtemplate} enum RampOrientation { - /// Facing up on the [Board]. + /// Facing up on the Board. up, - /// Facing down on the [Board]. + /// Facing down on the Board. down, } diff --git a/lib/game/components/spaceship.dart b/packages/pinball_components/lib/src/components/spaceship.dart similarity index 62% rename from lib/game/components/spaceship.dart rename to packages/pinball_components/lib/src/components/spaceship.dart index 847e4ac8..8c6288c7 100644 --- a/lib/game/components/spaceship.dart +++ b/packages/pinball_components/lib/src/components/spaceship.dart @@ -5,23 +5,24 @@ import 'dart:math'; import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:pinball/flame/blueprint.dart'; -import 'package:pinball/game/game.dart'; -import 'package:pinball/gen/assets.gen.dart'; +import 'package:pinball_components/gen/assets.gen.dart'; import 'package:pinball_components/pinball_components.dart' hide Assets; +/// {@template spaceship} /// A [Blueprint] which creates the spaceship feature. +/// {@endtemplate} class Spaceship extends Forge2DBlueprint { - /// Total size of the spaceship - static const radius = 10.0; + /// {@macro spaceship} + Spaceship({required this.position}); + + /// Total size of the spaceship. + static final size = Vector2(24, 18); + + /// The [position] where the elements will be created + final Vector2 position; @override void build(_) { - final position = Vector2( - PinballGame.boardBounds.left + radius + 15, - PinballGame.boardBounds.center.dy + 30, - ); - addAllContactCallback([ SpaceshipHoleBallContactCallback(), SpaceshipEntranceBallContactCallback(), @@ -30,10 +31,9 @@ class Spaceship extends Forge2DBlueprint { addAll([ SpaceshipSaucer()..initialPosition = position, SpaceshipEntrance()..initialPosition = position, - SpaceshipBridge()..initialPosition = position, - SpaceshipBridgeTop()..initialPosition = position + Vector2(0, 5.5), - SpaceshipHole()..initialPosition = position - Vector2(5, 4), - SpaceshipHole()..initialPosition = position - Vector2(-5, 4), + AndroidHead()..initialPosition = position, + SpaceshipHole()..initialPosition = position - Vector2(4.8, 4.2), + SpaceshipHole()..initialPosition = position - Vector2(-7.2, 0.6), SpaceshipWall()..initialPosition = position, ]); } @@ -51,25 +51,15 @@ class SpaceshipSaucer extends BodyComponent with InitialPosition, Layered { @override Future onLoad() async { await super.onLoad(); - final sprites = await Future.wait([ - gameRef.loadSprite(Assets.images.components.spaceship.saucer.path), - gameRef.loadSprite(Assets.images.components.spaceship.upper.path), - ]); - - await add( - SpriteComponent( - sprite: sprites.first, - size: Vector2.all(Spaceship.radius * 2), - anchor: Anchor.center, - ), + final sprite = await gameRef.loadSprite( + Assets.images.spaceshipSaucer.keyName, ); await add( SpriteComponent( - sprite: sprites.last, - size: Vector2((Spaceship.radius * 2) + 0.5, Spaceship.radius), + sprite: sprite, + size: Spaceship.size, anchor: Anchor.center, - position: Vector2(0, -((Spaceship.radius * 2) / 3.5)), ), ); @@ -78,7 +68,7 @@ class SpaceshipSaucer extends BodyComponent with InitialPosition, Layered { @override Body createBody() { - final circleShape = CircleShape()..radius = Spaceship.radius; + final circleShape = CircleShape()..radius = 3; final bodyDef = BodyDef() ..userData = this @@ -92,48 +82,13 @@ class SpaceshipSaucer extends BodyComponent with InitialPosition, Layered { } } -/// {@spaceship_bridge_top} -/// The bridge of the spaceship (the android head) is divided in two -// [BodyComponent]s, this is the top part of it which contains a single sprite -/// {@endtemplate} -class SpaceshipBridgeTop extends BodyComponent with InitialPosition { - /// {@macro spaceship_bridge_top} - SpaceshipBridgeTop() : super(priority: 6); - - @override - Future onLoad() async { - await super.onLoad(); - - final sprite = await gameRef.loadSprite( - Assets.images.components.spaceship.androidTop.path, - ); - await add( - SpriteComponent( - sprite: sprite, - anchor: Anchor.center, - size: Vector2((Spaceship.radius * 2) / 2.5 - 1, Spaceship.radius / 2.5), - ), - ); - } - - @override - Body createBody() { - final bodyDef = BodyDef() - ..userData = this - ..position = initialPosition - ..type = BodyType.static; - - return world.createBody(bodyDef); - } -} - /// {@template spaceship_bridge} -/// The main part of the [SpaceshipBridge], this [BodyComponent] -/// provides both the collision and the rotation animation for the bridge. +/// A [BodyComponent] that provides both the collision and the rotation +/// animation for the bridge. /// {@endtemplate} -class SpaceshipBridge extends BodyComponent with InitialPosition, Layered { +class AndroidHead extends BodyComponent with InitialPosition, Layered { /// {@macro spaceship_bridge} - SpaceshipBridge() : super(priority: 3) { + AndroidHead() : super(priority: 3) { layer = Layer.spaceship; } @@ -144,17 +99,20 @@ class SpaceshipBridge extends BodyComponent with InitialPosition, Layered { renderBody = false; final sprite = await gameRef.images.load( - Assets.images.components.spaceship.androidBottom.path, + Assets.images.spaceshipBridge.keyName, ); + await add( SpriteAnimationComponent.fromFrameData( sprite, SpriteAnimationData.sequenced( - amount: 14, - stepTime: 0.2, - textureSize: Vector2(160, 114), + amount: 72, + amountPerRow: 24, + stepTime: 0.05, + textureSize: Vector2(82, 100), ), - size: Vector2.all((Spaceship.radius * 2) / 2.5), + size: Vector2(8.2, 10), + position: Vector2(0, -2), anchor: Anchor.center, ), ); @@ -162,7 +120,7 @@ class SpaceshipBridge extends BodyComponent with InitialPosition, Layered { @override Body createBody() { - final circleShape = CircleShape()..radius = Spaceship.radius / 2.5; + final circleShape = CircleShape()..radius = 2; final bodyDef = BodyDef() ..userData = this @@ -193,7 +151,8 @@ class SpaceshipEntrance extends RampOpening { @override Shape get shape { - const radius = Spaceship.radius * 2; + renderBody = false; + final radius = Spaceship.size.y / 2; return PolygonShape() ..setAsEdge( Vector2( @@ -221,7 +180,7 @@ class SpaceshipHole extends BodyComponent with InitialPosition, Layered { @override Body createBody() { renderBody = false; - final circleShape = CircleShape()..radius = Spaceship.radius / 40; + final circleShape = CircleShape()..radius = 1.5; final bodyDef = BodyDef() ..userData = this @@ -235,6 +194,28 @@ class SpaceshipHole extends BodyComponent with InitialPosition, Layered { } } +/// {@template spaceship_wall_shape} +/// The [ChainShape] that defines the shape of the [SpaceshipWall]. +/// {@endtemplate} +class _SpaceshipWallShape extends ChainShape { + /// {@macro spaceship_wall_shape} + _SpaceshipWallShape() { + final minorRadius = (Spaceship.size.y - 2) / 2; + final majorRadius = (Spaceship.size.x - 2) / 2; + + createChain( + [ + // TODO(alestiago): Try converting this logic to radian. + for (var angle = 20; angle <= 340; angle++) + Vector2( + minorRadius * cos(angle * pi / 180), + majorRadius * sin(angle * pi / 180), + ), + ], + ); + } +} + /// {@template spaceship_wall} /// A [BodyComponent] that provides the collision for the wall /// surrounding the spaceship, with a small opening to allow the @@ -247,39 +228,11 @@ class SpaceshipWall extends BodyComponent with InitialPosition, Layered { layer = Layer.spaceship; } - @override - Future onLoad() async { - await super.onLoad(); - - final sprite = await gameRef.loadSprite( - Assets.images.components.spaceship.lower.path, - ); - - await add( - SpriteComponent( - sprite: sprite, - size: Vector2(Spaceship.radius * 2, Spaceship.radius + 1), - anchor: Anchor.center, - position: Vector2(-Spaceship.radius / 2, 0), - angle: 90 * pi / 180, - ), - ); - } - @override Body createBody() { renderBody = false; - final wallShape = ChainShape() - ..createChain( - [ - for (var angle = 20; angle <= 340; angle++) - Vector2( - Spaceship.radius * cos(angle * pi / 180), - Spaceship.radius * sin(angle * pi / 180), - ), - ], - ); + final wallShape = _SpaceshipWallShape(); final bodyDef = BodyDef() ..userData = this diff --git a/lib/flame/blueprint.dart b/packages/pinball_components/lib/src/flame/blueprint.dart similarity index 100% rename from lib/flame/blueprint.dart rename to packages/pinball_components/lib/src/flame/blueprint.dart diff --git a/packages/pinball_components/lib/src/flame/flame.dart b/packages/pinball_components/lib/src/flame/flame.dart new file mode 100644 index 00000000..c46a6fd2 --- /dev/null +++ b/packages/pinball_components/lib/src/flame/flame.dart @@ -0,0 +1 @@ +export 'blueprint.dart'; diff --git a/packages/pinball_components/lib/src/pinball_components.dart b/packages/pinball_components/lib/src/pinball_components.dart index 003c1c49..bd8f99de 100644 --- a/packages/pinball_components/lib/src/pinball_components.dart +++ b/packages/pinball_components/lib/src/pinball_components.dart @@ -1 +1,2 @@ export 'components/components.dart'; +export 'flame/flame.dart'; diff --git a/packages/pinball_components/sandbox/lib/common/games.dart b/packages/pinball_components/sandbox/lib/common/games.dart index bce1ff90..4aae07cb 100644 --- a/packages/pinball_components/sandbox/lib/common/games.dart +++ b/packages/pinball_components/sandbox/lib/common/games.dart @@ -5,7 +5,7 @@ import 'package:flame/input.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/material.dart'; -class BasicGame extends Forge2DGame { +abstract class BasicGame extends Forge2DGame { BasicGame() { images.prefix = ''; } diff --git a/packages/pinball_components/sandbox/lib/main.dart b/packages/pinball_components/sandbox/lib/main.dart index 113d61ac..2df3c16c 100644 --- a/packages/pinball_components/sandbox/lib/main.dart +++ b/packages/pinball_components/sandbox/lib/main.dart @@ -7,6 +7,7 @@ import 'package:dashbook/dashbook.dart'; import 'package:flutter/material.dart'; import 'package:sandbox/stories/effects/effects.dart'; +import 'package:sandbox/stories/spaceship/spaceship.dart'; import 'package:sandbox/stories/stories.dart'; void main() { @@ -16,5 +17,6 @@ void main() { addLayerStories(dashbook); addEffectsStories(dashbook); addFlipperStories(dashbook); + addSpaceshipStories(dashbook); runApp(dashbook); } diff --git a/packages/pinball_components/sandbox/lib/stories/spaceship/basic.dart b/packages/pinball_components/sandbox/lib/stories/spaceship/basic.dart new file mode 100644 index 00000000..6f33f444 --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/spaceship/basic.dart @@ -0,0 +1,31 @@ +import 'dart:async'; + +import 'package:flame/input.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:sandbox/common/common.dart'; + +class BasicSpaceship extends BasicGame with TapDetector { + static String info = 'Renders a spaceship and allows balls to be ' + 'spawned upon click to test their interactions'; + + @override + Future onLoad() async { + await super.onLoad(); + + camera.followVector2(Vector2.zero()); + + unawaited( + addFromBlueprint(Spaceship(position: Vector2.zero())), + ); + } + + @override + void onTapUp(TapUpInfo info) { + add( + Ball(baseColor: Colors.blue) + ..initialPosition = info.eventPosition.game + ..layer = Layer.jetpack, + ); + } +} diff --git a/packages/pinball_components/sandbox/lib/stories/spaceship/spaceship.dart b/packages/pinball_components/sandbox/lib/stories/spaceship/spaceship.dart new file mode 100644 index 00000000..635439ee --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/spaceship/spaceship.dart @@ -0,0 +1,13 @@ +import 'package:dashbook/dashbook.dart'; +import 'package:flame/game.dart'; +import 'package:sandbox/common/common.dart'; +import 'package:sandbox/stories/spaceship/basic.dart'; + +void addSpaceshipStories(Dashbook dashbook) { + dashbook.storiesOf('Spaceship').add( + 'Basic', + (context) => GameWidget(game: BasicSpaceship()), + codeLink: buildSourceLink('spaceship/basic.dart'), + info: BasicSpaceship.info, + ); +} diff --git a/packages/pinball_components/test/helpers/mocks.dart b/packages/pinball_components/test/helpers/mocks.dart index 67df9918..8d6f45b3 100644 --- a/packages/pinball_components/test/helpers/mocks.dart +++ b/packages/pinball_components/test/helpers/mocks.dart @@ -1,5 +1,26 @@ import 'dart:ui'; +import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:mocktail/mocktail.dart'; +import 'package:pinball_components/pinball_components.dart'; class MockCanvas extends Mock implements Canvas {} + +class MockFilter extends Mock implements Filter {} + +class MockFixture extends Mock implements Fixture {} + +class MockBody extends Mock implements Body {} + +class MockBall extends Mock implements Ball {} + +class MockGame extends Mock implements Forge2DGame {} + +class MockSpaceshipEntrance extends Mock implements SpaceshipEntrance {} + +class MockSpaceshipHole extends Mock implements SpaceshipHole {} + +class MockContact extends Mock implements Contact {} + +class MockContactCallback extends Mock + implements ContactCallback {} diff --git a/packages/pinball_components/test/src/components/golden/spaceship.png b/packages/pinball_components/test/src/components/golden/spaceship.png new file mode 100644 index 00000000..579d955f Binary files /dev/null and b/packages/pinball_components/test/src/components/golden/spaceship.png differ diff --git a/test/game/components/ramp_opening_test.dart b/packages/pinball_components/test/src/components/ramp_opening_test.dart similarity index 97% rename from test/game/components/ramp_opening_test.dart rename to packages/pinball_components/test/src/components/ramp_opening_test.dart index 11cf8ddc..c49e9164 100644 --- a/test/game/components/ramp_opening_test.dart +++ b/packages/pinball_components/test/src/components/ramp_opening_test.dart @@ -2,8 +2,7 @@ import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:mockingjay/mockingjay.dart'; -import 'package:pinball/game/game.dart'; +import 'package:mocktail/mocktail.dart'; import 'package:pinball_components/pinball_components.dart'; import '../../helpers/helpers.dart'; @@ -34,11 +33,11 @@ class TestRampOpeningBallContactCallback void main() { TestWidgetsFlutterBinding.ensureInitialized(); - final flameTester = FlameTester(PinballGameTest.create); + final flameTester = FlameTester(TestGame.new); group('RampOpening', () { TestWidgetsFlutterBinding.ensureInitialized(); - final flameTester = FlameTester(PinballGameTest.create); + final flameTester = FlameTester(TestGame.new); flameTester.test( 'loads correctly', diff --git a/test/game/components/spaceship_test.dart b/packages/pinball_components/test/src/components/spaceship_test.dart similarity index 68% rename from test/game/components/spaceship_test.dart rename to packages/pinball_components/test/src/components/spaceship_test.dart index 52b12609..127d94a4 100644 --- a/test/game/components/spaceship_test.dart +++ b/packages/pinball_components/test/src/components/spaceship_test.dart @@ -1,7 +1,10 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame/game.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; -import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; import '../../helpers/helpers.dart'; @@ -11,10 +14,10 @@ void main() { late Filter filterData; late Fixture fixture; late Body body; - late PinballGame game; late Ball ball; late SpaceshipEntrance entrance; late SpaceshipHole hole; + late Forge2DGame game; setUp(() { filterData = MockFilter(); @@ -25,7 +28,7 @@ void main() { body = MockBody(); when(() => body.fixtures).thenReturn([fixture]); - game = MockPinballGame(); + game = MockGame(); ball = MockBall(); when(() => ball.gameRef).thenReturn(game); @@ -35,6 +38,27 @@ void main() { hole = MockSpaceshipHole(); }); + group('Spaceship', () { + testWidgets('renders correctly', (tester) async { + final game = TestGame(); + + // TODO(erickzanardo): This should be handled by flame test. + // refctor it when https://github.com/flame-engine/flame/pull/1501 is merged + await tester.runAsync(() async { + await tester.pumpWidget(GameWidget(game: game)); + await game.ready(); + await game.addFromBlueprint(Spaceship(position: Vector2(30, -30))); + await game.ready(); + await tester.pump(); + }); + + await expectLater( + find.byGame(), + matchesGoldenFile('golden/spaceship.png'), + ); + }); + }); + group('SpaceshipEntranceBallContactCallback', () { test('changes the ball priority on contact', () { SpaceshipEntranceBallContactCallback().begin( diff --git a/test/flame/blueprint_test.dart b/packages/pinball_components/test/src/flame/blueprint_test.dart similarity index 86% rename from test/flame/blueprint_test.dart rename to packages/pinball_components/test/src/flame/blueprint_test.dart index e5fc2c4f..a9629422 100644 --- a/test/flame/blueprint_test.dart +++ b/packages/pinball_components/test/src/flame/blueprint_test.dart @@ -1,10 +1,9 @@ import 'package:flame/components.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; -import 'package:pinball/flame/blueprint.dart'; -import 'package:pinball/game/game.dart'; +import 'package:pinball_components/pinball_components.dart'; -import '../helpers/helpers.dart'; +import '../../helpers/helpers.dart'; class MyBlueprint extends Blueprint { @override @@ -52,19 +51,19 @@ void main() { }); test('components can be added to it', () { - final blueprint = MyBlueprint()..build(MockPinballGame()); + final blueprint = MyBlueprint()..build(MockGame()); expect(blueprint.components.length, equals(3)); }); test('blueprints can be added to it', () { - final blueprint = MyComposedBlueprint()..build(MockPinballGame()); + final blueprint = MyComposedBlueprint()..build(MockGame()); expect(blueprint.blueprints.length, equals(3)); }); test('adds the components to a game on attach', () { - final mockGame = MockPinballGame(); + final mockGame = MockGame(); when(() => mockGame.addAll(any())).thenAnswer((_) async {}); MyBlueprint().attach(mockGame); @@ -72,7 +71,7 @@ void main() { }); test('adds components from a child Blueprint the to a game on attach', () { - final mockGame = MockPinballGame(); + final mockGame = MockGame(); when(() => mockGame.addAll(any())).thenAnswer((_) async {}); MyComposedBlueprint().attach(mockGame); @@ -82,7 +81,7 @@ void main() { test( 'throws assertion error when adding to an already attached blueprint', () async { - final mockGame = MockPinballGame(); + final mockGame = MockGame(); when(() => mockGame.addAll(any())).thenAnswer((_) async {}); final blueprint = MyBlueprint(); await blueprint.attach(mockGame); @@ -99,13 +98,13 @@ void main() { }); test('callbacks can be added to it', () { - final blueprint = MyForge2dBlueprint()..build(MockPinballGame()); + final blueprint = MyForge2dBlueprint()..build(MockGame()); expect(blueprint.callbacks.length, equals(3)); }); test('adds the callbacks to a game on attach', () async { - final mockGame = MockPinballGame(); + final mockGame = MockGame(); when(() => mockGame.addAll(any())).thenAnswer((_) async {}); when(() => mockGame.addContactCallback(any())).thenAnswer((_) async {}); await MyForge2dBlueprint().attach(mockGame); @@ -116,7 +115,7 @@ void main() { test( 'throws assertion error when adding to an already attached blueprint', () async { - final mockGame = MockPinballGame(); + final mockGame = MockGame(); when(() => mockGame.addAll(any())).thenAnswer((_) async {}); when(() => mockGame.addContactCallback(any())).thenAnswer((_) async {}); final blueprint = MyForge2dBlueprint(); diff --git a/pubspec.yaml b/pubspec.yaml index 1efe9281..d2b520a9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -43,7 +43,6 @@ flutter: assets: - assets/images/components/ - - assets/images/components/spaceship/ flutter_gen: line_length: 80