diff --git a/.github/workflows/share_repository.yaml b/.github/workflows/share_repository.yaml new file mode 100644 index 00000000..2860902b --- /dev/null +++ b/.github/workflows/share_repository.yaml @@ -0,0 +1,18 @@ +name: share_repository + +on: + push: + paths: + - "packages/share_repository/**" + - ".github/workflows/share_repository.yaml" + + pull_request: + paths: + - "packages/share_repository/**" + - ".github/workflows/share_repository.yaml" + +jobs: + build: + uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1 + with: + working_directory: packages/share_repository 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 d3c0d3a6..679d638e 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 @@ -188,3 +190,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_components/test/src/components/golden/boundaries.png b/packages/pinball_components/test/src/components/golden/boundaries.png index ecb396c4..6cb24bbd 100644 Binary files a/packages/pinball_components/test/src/components/golden/boundaries.png and b/packages/pinball_components/test/src/components/golden/boundaries.png differ 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/packages/share_repository/.gitignore b/packages/share_repository/.gitignore new file mode 100644 index 00000000..526da158 --- /dev/null +++ b/packages/share_repository/.gitignore @@ -0,0 +1,7 @@ +# See https://www.dartlang.org/guides/libraries/private-files + +# Files and directories created by pub +.dart_tool/ +.packages +build/ +pubspec.lock \ No newline at end of file diff --git a/packages/share_repository/README.md b/packages/share_repository/README.md new file mode 100644 index 00000000..0473707b --- /dev/null +++ b/packages/share_repository/README.md @@ -0,0 +1,11 @@ +# share_repository + +[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link] +[![License: MIT][license_badge]][license_link] + +Repository to facilitate sharing scores. + +[license_badge]: https://img.shields.io/badge/license-MIT-blue.svg +[license_link]: https://opensource.org/licenses/MIT +[very_good_analysis_badge]: https://img.shields.io/badge/style-very_good_analysis-B22C89.svg +[very_good_analysis_link]: https://pub.dev/packages/very_good_analysis \ No newline at end of file diff --git a/packages/share_repository/analysis_options.yaml b/packages/share_repository/analysis_options.yaml new file mode 100644 index 00000000..3742fc3d --- /dev/null +++ b/packages/share_repository/analysis_options.yaml @@ -0,0 +1 @@ +include: package:very_good_analysis/analysis_options.2.4.0.yaml \ No newline at end of file diff --git a/packages/share_repository/lib/share_repository.dart b/packages/share_repository/lib/share_repository.dart new file mode 100644 index 00000000..0b6d064c --- /dev/null +++ b/packages/share_repository/lib/share_repository.dart @@ -0,0 +1,3 @@ +library share_repository; + +export 'src/share_repository.dart'; diff --git a/packages/share_repository/lib/src/share_repository.dart b/packages/share_repository/lib/src/share_repository.dart new file mode 100644 index 00000000..6c1f36d0 --- /dev/null +++ b/packages/share_repository/lib/src/share_repository.dart @@ -0,0 +1,7 @@ +/// {@template share_repository} +/// Repository to facilitate sharing scores. +/// {@endtemplate} +class ShareRepository { + /// {@macro share_repository} + const ShareRepository(); +} diff --git a/packages/share_repository/pubspec.yaml b/packages/share_repository/pubspec.yaml new file mode 100644 index 00000000..dc3d4e86 --- /dev/null +++ b/packages/share_repository/pubspec.yaml @@ -0,0 +1,13 @@ +name: share_repository +description: Repository to facilitate sharing scores. +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.16.0 <3.0.0" + +dev_dependencies: + coverage: ^1.1.0 + mocktail: ^0.2.0 + test: ^1.19.2 + very_good_analysis: ^2.4.0 diff --git a/packages/share_repository/test/src/share_repository_test.dart b/packages/share_repository/test/src/share_repository_test.dart new file mode 100644 index 00000000..e6cc536b --- /dev/null +++ b/packages/share_repository/test/src/share_repository_test.dart @@ -0,0 +1,11 @@ +// ignore_for_file: prefer_const_constructors +import 'package:share_repository/share_repository.dart'; +import 'package:test/test.dart'; + +void main() { + group('ShareRepository', () { + test('can be instantiated', () { + expect(ShareRepository(), isNotNull); + }); + }); +} diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index f0420df6..aebb31f9 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, ), ], ),