diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index 16b09d3a..9dc88562 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -47,6 +47,7 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.plunger.rocket.keyName), images.load(components.Assets.images.boundary.bottom.keyName), images.load(components.Assets.images.boundary.outer.keyName), + images.load(components.Assets.images.boundary.outerBottom.keyName), images.load(components.Assets.images.spaceship.saucer.keyName), images.load(components.Assets.images.spaceship.bridge.keyName), images.load(components.Assets.images.spaceship.ramp.boardOpening.keyName), diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 1bac998a..55a6b23a 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flame/components.dart'; +import 'package:flame/game.dart'; import 'package:flame/input.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; @@ -134,7 +135,7 @@ class _GameBallsController extends ComponentController } } -class DebugPinballGame extends PinballGame with TapDetector { +class DebugPinballGame extends PinballGame with FPSCounter, TapDetector { DebugPinballGame({ required PinballTheme theme, required PinballAudio audio, @@ -149,6 +150,7 @@ class DebugPinballGame extends PinballGame with TapDetector { Future onLoad() async { await super.onLoad(); await _loadBackground(); + await add(_DebugInformation()); } // TODO(alestiago): Move to PinballGame once we have the real background @@ -191,3 +193,35 @@ class _DebugGameBallsController extends _GameBallsController { return noBallsLeft && canBallRespawn; } } + +class _DebugInformation extends Component with HasGameRef { + _DebugInformation() : super(priority: RenderPriority.debugInfo); + + @override + PositionType get positionType => PositionType.widget; + + final _debugTextPaint = TextPaint( + style: const TextStyle( + color: Colors.green, + fontSize: 10, + ), + ); + + final _debugBackgroundPaint = Paint()..color = Colors.white; + + @override + void render(Canvas canvas) { + final debugText = [ + 'FPS: ${gameRef.fps().toStringAsFixed(1)}', + 'BALLS: ${gameRef.descendants().whereType().length}', + ].join(' | '); + + final height = _debugTextPaint.measureTextHeight(debugText); + final position = Vector2(0, gameRef.camera.canvasSize.y - height); + canvas.drawRect( + position & Vector2(gameRef.camera.canvasSize.x, height), + _debugBackgroundPaint, + ); + _debugTextPaint.render(canvas, debugText, position); + } +} diff --git a/lib/leaderboard/models/leader_board_entry.dart b/lib/leaderboard/models/leader_board_entry.dart index cfd5ffd4..a86975dd 100644 --- a/lib/leaderboard/models/leader_board_entry.dart +++ b/lib/leaderboard/models/leader_board_entry.dart @@ -36,7 +36,7 @@ extension LeaderboardEntryDataX on LeaderboardEntryData { rank: position.toString(), playerInitials: playerInitials, score: score, - character: character.toTheme.character, + character: character.toTheme.leaderboardIcon, ); } } diff --git a/lib/theme/view/character_selection_page.dart b/lib/theme/view/character_selection_page.dart index 22aaee22..ef37270b 100644 --- a/lib/theme/view/character_selection_page.dart +++ b/lib/theme/view/character_selection_page.dart @@ -124,7 +124,7 @@ class CharacterImageButton extends StatelessWidget { ), child: Padding( padding: const EdgeInsets.all(8), - child: characterTheme.character.image(), + child: characterTheme.icon.image(), ), ), ); diff --git a/packages/pinball_components/assets/images/boundary/outer-bottom.png b/packages/pinball_components/assets/images/boundary/outer-bottom.png new file mode 100644 index 00000000..508bcee8 Binary files /dev/null and b/packages/pinball_components/assets/images/boundary/outer-bottom.png differ diff --git a/packages/pinball_components/lib/gen/assets.gen.dart b/packages/pinball_components/lib/gen/assets.gen.dart index 558d36a1..4d4cda7d 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -86,6 +86,10 @@ class $AssetsImagesBoundaryGen { AssetGenImage get bottom => const AssetGenImage('assets/images/boundary/bottom.png'); + /// File path: assets/images/boundary/outer-bottom.png + AssetGenImage get outerBottom => + const AssetGenImage('assets/images/boundary/outer-bottom.png'); + /// File path: assets/images/boundary/outer.png AssetGenImage get outer => const AssetGenImage('assets/images/boundary/outer.png'); diff --git a/packages/pinball_components/lib/src/components/boundaries.dart b/packages/pinball_components/lib/src/components/boundaries.dart index 254cbfcf..86e1844e 100644 --- a/packages/pinball_components/lib/src/components/boundaries.dart +++ b/packages/pinball_components/lib/src/components/boundaries.dart @@ -13,6 +13,7 @@ class Boundaries extends Blueprint { components: [ _BottomBoundary(), _OuterBoundary(), + _OuterBottomBoundarySpriteComponent(), ], ); } @@ -91,8 +92,10 @@ class _OuterBoundary extends BodyComponent with InitialPosition { /// {@macro outer_boundary} _OuterBoundary() : super( - priority: RenderPriority.outerBoudary, - children: [_OuterBoundarySpriteComponent()], + priority: RenderPriority.outerBoundary, + children: [ + _OuterBoundarySpriteComponent(), + ], ) { renderBody = false; } @@ -157,3 +160,25 @@ class _OuterBoundarySpriteComponent extends SpriteComponent with HasGameRef { size = sprite.originalSize / 10; } } + +class _OuterBottomBoundarySpriteComponent extends SpriteComponent + with HasGameRef { + _OuterBottomBoundarySpriteComponent() + : super( + priority: RenderPriority.outerBottomBoundary, + anchor: Anchor.center, + position: Vector2(0, 71), + ); + + @override + Future onLoad() async { + await super.onLoad(); + final sprite = Sprite( + gameRef.images.fromCache( + Assets.images.boundary.outerBottom.keyName, + ), + ); + this.sprite = sprite; + size = sprite.originalSize / 10; + } +} diff --git a/packages/pinball_components/lib/src/components/render_priority.dart b/packages/pinball_components/lib/src/components/render_priority.dart index b179cce9..d2438db9 100644 --- a/packages/pinball_components/lib/src/components/render_priority.dart +++ b/packages/pinball_components/lib/src/components/render_priority.dart @@ -39,7 +39,9 @@ abstract class RenderPriority { static const int bottomBoundary = _above + dinoBottomWall; - static const int outerBoudary = _above + background; + static const int outerBoundary = _above + background; + + static const int outerBottomBoundary = _above + rocket; // Bottom Group @@ -47,7 +49,7 @@ abstract class RenderPriority { // Launcher - static const int launchRamp = _above + outerBoudary; + static const int launchRamp = _above + outerBoundary; static const int launchRampForegroundRailing = _below + ballOnBoard; @@ -113,4 +115,7 @@ abstract class RenderPriority { // Score Text static const int scoreText = _above + spaceshipRampForegroundRailing; + + // Debug information + static const int debugInfo = _above + scoreText; } diff --git a/packages/pinball_components/sandbox/lib/stories/boundaries/boundaries_game.dart b/packages/pinball_components/sandbox/lib/stories/boundaries/boundaries_game.dart index ca7c8cc8..5ae1dd29 100644 --- a/packages/pinball_components/sandbox/lib/stories/boundaries/boundaries_game.dart +++ b/packages/pinball_components/sandbox/lib/stories/boundaries/boundaries_game.dart @@ -18,6 +18,7 @@ class BoundariesGame extends BasicBallGame with Traceable { await images.loadAll([ Assets.images.boundary.outer.keyName, + Assets.images.boundary.outerBottom.keyName, Assets.images.boundary.bottom.keyName, ]); diff --git a/packages/pinball_components/test/src/components/boundaries_test.dart b/packages/pinball_components/test/src/components/boundaries_test.dart index 9affe0b7..4e2fb497 100644 --- a/packages/pinball_components/test/src/components/boundaries_test.dart +++ b/packages/pinball_components/test/src/components/boundaries_test.dart @@ -10,20 +10,24 @@ import '../../helpers/helpers.dart'; void main() { group('Boundaries', () { + TestWidgetsFlutterBinding.ensureInitialized(); + final assets = [ Assets.images.boundary.outer.keyName, + Assets.images.boundary.outerBottom.keyName, Assets.images.boundary.bottom.keyName, ]; - final tester = FlameTester(TestGame.new); + final flameTester = FlameTester(TestGame.new); - tester.testGameWidget( + flameTester.testGameWidget( 'render correctly', setUp: (game, tester) async { await game.images.loadAll(assets); await game.addFromBlueprint(Boundaries()); + await game.ready(); + game.camera.followVector2(Vector2.zero()); game.camera.zoom = 3.2; - await tester.pump(); }, verify: (game, tester) async { await expectLater( diff --git a/packages/pinball_theme/assets/images/android/animation.png b/packages/pinball_theme/assets/images/android/animation.png new file mode 100644 index 00000000..fc7465be Binary files /dev/null and b/packages/pinball_theme/assets/images/android/animation.png differ diff --git a/packages/pinball_theme/assets/images/android/character.png b/packages/pinball_theme/assets/images/android/character.png deleted file mode 100644 index 736f1e6f..00000000 Binary files a/packages/pinball_theme/assets/images/android/character.png and /dev/null differ diff --git a/packages/pinball_theme/assets/images/dash/animation.png b/packages/pinball_theme/assets/images/dash/animation.png new file mode 100644 index 00000000..e812415f Binary files /dev/null and b/packages/pinball_theme/assets/images/dash/animation.png differ diff --git a/packages/pinball_theme/assets/images/dash/character.png b/packages/pinball_theme/assets/images/dash/character.png deleted file mode 100644 index d76795aa..00000000 Binary files a/packages/pinball_theme/assets/images/dash/character.png and /dev/null differ diff --git a/packages/pinball_theme/assets/images/dino/animation.png b/packages/pinball_theme/assets/images/dino/animation.png new file mode 100644 index 00000000..c75b16f9 Binary files /dev/null and b/packages/pinball_theme/assets/images/dino/animation.png differ diff --git a/packages/pinball_theme/assets/images/dino/character.png b/packages/pinball_theme/assets/images/dino/character.png deleted file mode 100644 index c6f5a390..00000000 Binary files a/packages/pinball_theme/assets/images/dino/character.png and /dev/null differ diff --git a/packages/pinball_theme/assets/images/sparky/animation.png b/packages/pinball_theme/assets/images/sparky/animation.png new file mode 100644 index 00000000..1aff4772 Binary files /dev/null and b/packages/pinball_theme/assets/images/sparky/animation.png differ diff --git a/packages/pinball_theme/assets/images/sparky/character.png b/packages/pinball_theme/assets/images/sparky/character.png deleted file mode 100644 index c37403b3..00000000 Binary files a/packages/pinball_theme/assets/images/sparky/character.png and /dev/null differ diff --git a/packages/pinball_theme/lib/src/generated/assets.gen.dart b/packages/pinball_theme/lib/src/generated/assets.gen.dart index f050c621..3feeecce 100644 --- a/packages/pinball_theme/lib/src/generated/assets.gen.dart +++ b/packages/pinball_theme/lib/src/generated/assets.gen.dart @@ -28,6 +28,10 @@ class $AssetsImagesGen { class $AssetsImagesAndroidGen { const $AssetsImagesAndroidGen(); + /// File path: assets/images/android/animation.png + AssetGenImage get animation => + const AssetGenImage('assets/images/android/animation.png'); + /// File path: assets/images/android/background.png AssetGenImage get background => const AssetGenImage('assets/images/android/background.png'); @@ -48,6 +52,10 @@ class $AssetsImagesAndroidGen { class $AssetsImagesDashGen { const $AssetsImagesDashGen(); + /// File path: assets/images/dash/animation.png + AssetGenImage get animation => + const AssetGenImage('assets/images/dash/animation.png'); + /// File path: assets/images/dash/background.png AssetGenImage get background => const AssetGenImage('assets/images/dash/background.png'); @@ -67,6 +75,10 @@ class $AssetsImagesDashGen { class $AssetsImagesDinoGen { const $AssetsImagesDinoGen(); + /// File path: assets/images/dino/animation.png + AssetGenImage get animation => + const AssetGenImage('assets/images/dino/animation.png'); + /// File path: assets/images/dino/background.png AssetGenImage get background => const AssetGenImage('assets/images/dino/background.png'); @@ -86,6 +98,10 @@ class $AssetsImagesDinoGen { class $AssetsImagesSparkyGen { const $AssetsImagesSparkyGen(); + /// File path: assets/images/sparky/animation.png + AssetGenImage get animation => + const AssetGenImage('assets/images/sparky/animation.png'); + /// File path: assets/images/sparky/background.png AssetGenImage get background => const AssetGenImage('assets/images/sparky/background.png'); diff --git a/packages/pinball_theme/lib/src/themes/android_theme.dart b/packages/pinball_theme/lib/src/themes/android_theme.dart index 1001ca5f..8989c717 100644 --- a/packages/pinball_theme/lib/src/themes/android_theme.dart +++ b/packages/pinball_theme/lib/src/themes/android_theme.dart @@ -14,9 +14,6 @@ class AndroidTheme extends CharacterTheme { @override Color get ballColor => Colors.green; - @override - AssetGenImage get character => Assets.images.android.character; - @override AssetGenImage get background => Assets.images.android.background; @@ -25,4 +22,7 @@ class AndroidTheme extends CharacterTheme { @override AssetGenImage get leaderboardIcon => Assets.images.android.leaderboardIcon; + + @override + AssetGenImage get animation => Assets.images.android.animation; } diff --git a/packages/pinball_theme/lib/src/themes/character_theme.dart b/packages/pinball_theme/lib/src/themes/character_theme.dart index 9c5f6ba6..072c917f 100644 --- a/packages/pinball_theme/lib/src/themes/character_theme.dart +++ b/packages/pinball_theme/lib/src/themes/character_theme.dart @@ -18,9 +18,6 @@ abstract class CharacterTheme extends Equatable { /// Ball color for this theme. Color get ballColor; - /// Asset for the theme character. - AssetGenImage get character; - /// Asset for the background. AssetGenImage get background; @@ -30,13 +27,16 @@ abstract class CharacterTheme extends Equatable { /// Icon asset for the leaderboard. AssetGenImage get leaderboardIcon; + /// Asset for the the idle character animation. + AssetGenImage get animation; + @override List get props => [ name, ballColor, - character, background, icon, leaderboardIcon, + animation, ]; } diff --git a/packages/pinball_theme/lib/src/themes/dash_theme.dart b/packages/pinball_theme/lib/src/themes/dash_theme.dart index 9038f2fc..7584c8ed 100644 --- a/packages/pinball_theme/lib/src/themes/dash_theme.dart +++ b/packages/pinball_theme/lib/src/themes/dash_theme.dart @@ -14,9 +14,6 @@ class DashTheme extends CharacterTheme { @override Color get ballColor => Colors.blue; - @override - AssetGenImage get character => Assets.images.dash.character; - @override AssetGenImage get background => Assets.images.dash.background; @@ -25,4 +22,7 @@ class DashTheme extends CharacterTheme { @override AssetGenImage get leaderboardIcon => Assets.images.dash.leaderboardIcon; + + @override + AssetGenImage get animation => Assets.images.dash.animation; } diff --git a/packages/pinball_theme/lib/src/themes/dino_theme.dart b/packages/pinball_theme/lib/src/themes/dino_theme.dart index b434463e..3baf466c 100644 --- a/packages/pinball_theme/lib/src/themes/dino_theme.dart +++ b/packages/pinball_theme/lib/src/themes/dino_theme.dart @@ -14,9 +14,6 @@ class DinoTheme extends CharacterTheme { @override Color get ballColor => Colors.grey; - @override - AssetGenImage get character => Assets.images.dino.character; - @override AssetGenImage get background => Assets.images.dino.background; @@ -25,4 +22,7 @@ class DinoTheme extends CharacterTheme { @override AssetGenImage get leaderboardIcon => Assets.images.dino.leaderboardIcon; + + @override + AssetGenImage get animation => Assets.images.dino.animation; } diff --git a/packages/pinball_theme/lib/src/themes/sparky_theme.dart b/packages/pinball_theme/lib/src/themes/sparky_theme.dart index 9e71bef8..7884a22f 100644 --- a/packages/pinball_theme/lib/src/themes/sparky_theme.dart +++ b/packages/pinball_theme/lib/src/themes/sparky_theme.dart @@ -14,9 +14,6 @@ class SparkyTheme extends CharacterTheme { @override String get name => 'Sparky'; - @override - AssetGenImage get character => Assets.images.sparky.character; - @override AssetGenImage get background => Assets.images.sparky.background; @@ -25,4 +22,7 @@ class SparkyTheme extends CharacterTheme { @override AssetGenImage get leaderboardIcon => Assets.images.sparky.leaderboardIcon; + + @override + AssetGenImage get animation => Assets.images.sparky.animation; } diff --git a/pubspec.lock b/pubspec.lock index 31aed6af..1a502f37 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,14 +7,14 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "39.0.0" + version: "31.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "2.8.0" args: dependency: transitive description: @@ -71,6 +71,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.5" clock: dependency: transitive description: @@ -314,7 +321,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.4" + version: "0.6.3" json_annotation: dependency: transitive description: @@ -349,7 +356,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.3" meta: dependency: transitive description: @@ -412,7 +419,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.0" path_provider: dependency: transitive description: @@ -585,7 +592,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.2" + version: "1.8.1" stack_trace: dependency: transitive description: @@ -627,21 +634,21 @@ packages: name: test url: "https://pub.dartlang.org" source: hosted - version: "1.21.1" + version: "1.19.5" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.8" test_core: dependency: transitive description: name: test_core url: "https://pub.dartlang.org" source: hosted - version: "0.4.13" + version: "0.4.9" typed_data: dependency: transitive description: @@ -662,7 +669,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" + version: "2.1.1" very_good_analysis: dependency: "direct dev" description: diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index 18693055..d6bbb099 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -50,6 +50,7 @@ void main() { Assets.images.flipper.left.keyName, Assets.images.flipper.right.keyName, Assets.images.boundary.outer.keyName, + Assets.images.boundary.outerBottom.keyName, Assets.images.boundary.bottom.keyName, Assets.images.slingshot.upper.keyName, Assets.images.slingshot.lower.keyName, diff --git a/test/leaderboard/bloc/leaderboard_state_test.dart b/test/leaderboard/bloc/leaderboard_state_test.dart index ec455f1f..1b5d41d9 100644 --- a/test/leaderboard/bloc/leaderboard_state_test.dart +++ b/test/leaderboard/bloc/leaderboard_state_test.dart @@ -30,7 +30,7 @@ void main() { rank: '1', playerInitials: 'ABC', score: 1500, - character: DashTheme().character, + character: DashTheme().leaderboardIcon, ); test( diff --git a/test/leaderboard/view/leaderboard_page_test.dart b/test/leaderboard/view/leaderboard_page_test.dart index b17c27b8..daacb4a7 100644 --- a/test/leaderboard/view/leaderboard_page_test.dart +++ b/test/leaderboard/view/leaderboard_page_test.dart @@ -121,7 +121,7 @@ void main() { rank: '1', playerInitials: 'ABC', score: 10000, - character: DashTheme().character, + character: DashTheme().leaderboardIcon, ), ], ),