diff --git a/lib/select_character/widgets/star_animation.dart b/lib/select_character/widgets/star_animation.dart new file mode 100644 index 00000000..0f23e336 --- /dev/null +++ b/lib/select_character/widgets/star_animation.dart @@ -0,0 +1,84 @@ +// ignore_for_file: public_member_api_docs + +import 'package:flame/flame.dart'; +import 'package:flame/sprite.dart'; +import 'package:flame/widgets.dart'; +import 'package:flutter/material.dart' hide Image; +import 'package:pinball/gen/gen.dart'; + +class StarAnimation extends StatelessWidget { + const StarAnimation._({ + Key? key, + required this.imagePath, + required this.columns, + required this.rows, + required this.stepTime, + }) : super(key: key); + + StarAnimation.starA({ + Key? key, + }) : this._( + key: key, + imagePath: Assets.images.selectCharacter.starA.keyName, + columns: 36, + rows: 2, + stepTime: 1 / 18, + ); + + StarAnimation.starB({ + Key? key, + }) : this._( + key: key, + imagePath: Assets.images.selectCharacter.starB.keyName, + columns: 36, + rows: 2, + stepTime: 1 / 36, + ); + + StarAnimation.starC({ + Key? key, + }) : this._( + key: key, + imagePath: Assets.images.selectCharacter.starC.keyName, + columns: 72, + rows: 1, + stepTime: 1 / 24, + ); + + final String imagePath; + final int columns; + final int rows; + final double stepTime; + + static Future loadAssets() { + Flame.images.prefix = ''; + + return Flame.images.loadAll([ + Assets.images.selectCharacter.starA.keyName, + Assets.images.selectCharacter.starB.keyName, + Assets.images.selectCharacter.starC.keyName, + ]); + } + + @override + Widget build(BuildContext context) { + final spriteSheet = SpriteSheet.fromColumnsAndRows( + image: Flame.images.fromCache(imagePath), + columns: columns, + rows: rows, + ); + final animation = spriteSheet.createAnimation( + row: 0, + stepTime: stepTime, + to: spriteSheet.rows * spriteSheet.columns, + ); + + return SizedBox( + width: 30, + height: 30, + child: SpriteAnimationWidget( + animation: animation, + ), + ); + } +} diff --git a/test/select_character/widgets/star_animation_test.dart b/test/select_character/widgets/star_animation_test.dart new file mode 100644 index 00000000..a743407f --- /dev/null +++ b/test/select_character/widgets/star_animation_test.dart @@ -0,0 +1,44 @@ +// ignore_for_file: invalid_use_of_protected_member + +import 'package:flame/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball/select_character/select_character.dart'; + +import '../../helpers/helpers.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('loads SpriteAnimationWidget correctly for', () { + setUpAll(() async { + await StarAnimation.loadAssets(); + }); + + testWidgets('starA', (tester) async { + await tester.pumpApp( + StarAnimation.starA(), + ); + await tester.pump(); + + expect(find.byType(SpriteAnimationWidget), findsOneWidget); + }); + + testWidgets('starB', (tester) async { + await tester.pumpApp( + StarAnimation.starB(), + ); + await tester.pump(); + + expect(find.byType(SpriteAnimationWidget), findsOneWidget); + }); + + testWidgets('starC', (tester) async { + await tester.pumpApp( + StarAnimation.starC(), + ); + await tester.pump(); + + expect(find.byType(SpriteAnimationWidget), findsOneWidget); + }); + }); +}