diff --git a/.gitignore b/.gitignore index 2d9c4dbe..a7531405 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,6 @@ app.*.map.json test/.test_runner.dart web/__/firebase/init.js + +# Application exceptions +!/packages/pinball_components/assets/images/flutter_sign_post.png diff --git a/lib/game/components/board.dart b/lib/game/components/board.dart index 84e6758d..fb6dcda3 100644 --- a/lib/game/components/board.dart +++ b/lib/game/components/board.dart @@ -7,7 +7,8 @@ import 'package:pinball_components/pinball_components.dart'; /// {endtemplate} class Board extends Component { /// {@macro board} - Board(); + // TODO(alestiago): Make Board a Blueprint and sort out priorities. + Board() : super(priority: 5); @override Future onLoad() async { diff --git a/lib/game/components/flutter_forest.dart b/lib/game/components/flutter_forest.dart index 19fba005..c5ed20bf 100644 --- a/lib/game/components/flutter_forest.dart +++ b/lib/game/components/flutter_forest.dart @@ -43,6 +43,8 @@ class FlutterForest extends Component Future onLoad() async { gameRef.addContactCallback(DashNestBumperBallContactCallback()); + final signPost = FlutterSignPost()..initialPosition = Vector2(8.35, 58.3); + // TODO(alestiago): adjust positioning once sprites are added. final smallLeftNest = SmallDashNestBumper(id: 'small_left_nest') ..initialPosition = Vector2(8.95, 51.95); @@ -52,6 +54,7 @@ class FlutterForest extends Component ..initialPosition = Vector2(18.55, 59.35); await addAll([ + signPost, smallLeftNest, smallRightNest, bigNest, diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index f597a066..73aae25f 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -8,6 +8,7 @@ extension PinballGameAssetsX on PinballGame { Future preLoadAssets() async { await Future.wait([ images.load(components.Assets.images.ball.keyName), + images.load(components.Assets.images.flutterSignPost.keyName), images.load(components.Assets.images.flipper.left.keyName), images.load(components.Assets.images.flipper.right.keyName), images.load(Assets.images.components.background.path), diff --git a/packages/pinball_components/assets/images/flutter_sign_post.png b/packages/pinball_components/assets/images/flutter_sign_post.png new file mode 100644 index 00000000..28a3facb Binary files /dev/null and b/packages/pinball_components/assets/images/flutter_sign_post.png differ diff --git a/packages/pinball_components/lib/gen/assets.gen.dart b/packages/pinball_components/lib/gen/assets.gen.dart index bbf6a227..54b0ff53 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -3,15 +3,27 @@ /// 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(); + + /// File path: assets/images/flutter_sign_post.png + AssetGenImage get flutterSignPost => + const AssetGenImage('assets/images/flutter_sign_post.png'); + + /// File path: assets/images/spaceship_bridge.png AssetGenImage get spaceshipBridge => const AssetGenImage('assets/images/spaceship_bridge.png'); + + /// File path: assets/images/spaceship_saucer.png AssetGenImage get spaceshipSaucer => const AssetGenImage('assets/images/spaceship_saucer.png'); } @@ -19,8 +31,11 @@ class $AssetsImagesGen { 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 e6bc912c..c29f91a3 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -2,6 +2,7 @@ export 'ball.dart'; export 'board_side.dart'; export 'fire_effect.dart'; export 'flipper.dart'; +export 'flutter_sign_post.dart'; export 'initial_position.dart'; export 'joint_anchor.dart'; export 'layer.dart'; diff --git a/packages/pinball_components/lib/src/components/flutter_sign_post.dart b/packages/pinball_components/lib/src/components/flutter_sign_post.dart new file mode 100644 index 00000000..deaceb76 --- /dev/null +++ b/packages/pinball_components/lib/src/components/flutter_sign_post.dart @@ -0,0 +1,41 @@ +import 'package:flame/components.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball_components/pinball_components.dart'; + +/// {@template flutter_sign_post} +/// A sign, found in the FlutterForest. +/// {@endtemplate} +// TODO(alestiago): Revisit doc comment if FlutterForest is moved to package. +class FlutterSignPost extends BodyComponent with InitialPosition { + Future _loadSprite() async { + final sprite = await gameRef.loadSprite( + Assets.images.flutterSignPost.keyName, + ); + final spriteComponent = SpriteComponent( + sprite: sprite, + size: sprite.originalSize / 10, + anchor: Anchor.bottomCenter, + position: Vector2(0.65, 0.45), + ); + await add(spriteComponent); + } + + @override + Future onLoad() async { + await super.onLoad(); + paint = Paint() + ..color = Colors.blue.withOpacity(0.5) + ..style = PaintingStyle.fill; + await _loadSprite(); + } + + @override + Body createBody() { + final shape = CircleShape()..radius = 0.25; + final fixtureDef = FixtureDef(shape); + final bodyDef = BodyDef()..position = initialPosition; + + return world.createBody(bodyDef)..createFixture(fixtureDef); + } +} diff --git a/packages/pinball_components/test/src/components/flutter_sign_post_test.dart b/packages/pinball_components/test/src/components/flutter_sign_post_test.dart new file mode 100644 index 00000000..98815af7 --- /dev/null +++ b/packages/pinball_components/test/src/components/flutter_sign_post_test.dart @@ -0,0 +1,25 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; + +import '../../helpers/helpers.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(TestGame.new); + + group('FlutterSignPost', () { + flameTester.test( + 'loads correctly', + (game) async { + final flutterSignPost = FlutterSignPost(); + await game.ready(); + await game.ensureAdd(flutterSignPost); + + expect(game.contains(flutterSignPost), isTrue); + }, + ); + }); +} diff --git a/test/game/components/board_test.dart b/test/game/components/board_test.dart index 7b74d0da..2f51b2b1 100644 --- a/test/game/components/board_test.dart +++ b/test/game/components/board_test.dart @@ -23,9 +23,9 @@ void main() { }, ); - group('children', () { + group('loads', () { flameTester.test( - 'has one left flipper', + 'one left flipper', (game) async { final board = Board(); await game.ready(); @@ -39,7 +39,7 @@ void main() { ); flameTester.test( - 'has one right flipper', + 'one right flipper', (game) async { final board = Board(); await game.ready(); @@ -52,7 +52,7 @@ void main() { ); flameTester.test( - 'has two Baseboards', + 'two Baseboards', (game) async { final board = Board(); await game.ready(); @@ -64,7 +64,7 @@ void main() { ); flameTester.test( - 'has two Kickers', + 'two Kickers', (game) async { final board = Board(); await game.ready(); @@ -76,7 +76,7 @@ void main() { ); flameTester.test( - 'has one FlutterForest', + 'one FlutterForest', (game) async { // TODO(alestiago): change to [NestBumpers] once provided. final board = Board(); @@ -89,7 +89,7 @@ void main() { ); flameTester.test( - 'has one ChromeDino', + 'one ChromeDino', (game) async { final board = Board(); await game.ready(); diff --git a/test/game/components/flutter_forest_test.dart b/test/game/components/flutter_forest_test.dart index 0dd9212d..659a4f13 100644 --- a/test/game/components/flutter_forest_test.dart +++ b/test/game/components/flutter_forest_test.dart @@ -25,6 +25,22 @@ void main() { }, ); + group('loads', () { + flameTester.test( + 'a FlutterSignPost', + (game) async { + await game.ready(); + final flutterForest = FlutterForest(); + await game.ensureAdd(flutterForest); + + expect( + game.descendants().whereType().length, + equals(1), + ); + }, + ); + }); + flameTester.test( 'onNewState adds a new ball', (game) async {