diff --git a/packages/pinball_components/lib/src/components/multiplier.dart b/packages/pinball_components/lib/src/components/multiplier.dart index bf165e06..e9775884 100644 --- a/packages/pinball_components/lib/src/components/multiplier.dart +++ b/packages/pinball_components/lib/src/components/multiplier.dart @@ -1,4 +1,79 @@ import 'package:flame/components.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball_components/gen/assets.gen.dart'; + +/// {@template multiplier} +/// A [Component] for the multiplier over the board. +/// {@endtemplate} +class Multiplier extends Component { + /// {@macro multiplier} + Multiplier({ + required int value, + required Vector2 position, + double rotation = 0, + }) : _value = value, + _position = position, + _rotation = rotation, + super(); + + final int _value; + final Vector2 _position; + final double _rotation; + late final MultiplierSpriteGroupComponent _sprite; + + /// Change current [Sprite] to active or inactive depending on applied + /// multiplier. + void toggle(int multiplier) { + if (multiplier == _value) { + _sprite.current = MultiplierSpriteState.active; + } else { + _sprite.current = MultiplierSpriteState.inactive; + } + } + + @override + Future onLoad() async { + await super.onLoad(); + + String onAssetPath; + String offAssetPath; + + switch (_value) { + case 2: + onAssetPath = Assets.images.multiplier.x2.active.keyName; + offAssetPath = Assets.images.multiplier.x2.inactive.keyName; + break; + case 3: + onAssetPath = Assets.images.multiplier.x3.active.keyName; + offAssetPath = Assets.images.multiplier.x3.inactive.keyName; + break; + case 4: + onAssetPath = Assets.images.multiplier.x4.active.keyName; + offAssetPath = Assets.images.multiplier.x4.inactive.keyName; + break; + case 5: + onAssetPath = Assets.images.multiplier.x5.active.keyName; + offAssetPath = Assets.images.multiplier.x5.inactive.keyName; + break; + case 6: + onAssetPath = Assets.images.multiplier.x6.active.keyName; + offAssetPath = Assets.images.multiplier.x6.inactive.keyName; + break; + default: + onAssetPath = Assets.images.multiplier.x2.active.keyName; + offAssetPath = Assets.images.multiplier.x2.inactive.keyName; + break; + } + + _sprite = MultiplierSpriteGroupComponent( + position: _position, + onAssetPath: onAssetPath, + offAssetPath: offAssetPath, + )..angle = _rotation; + + await add(_sprite); + } +} /// Indicates the current sprite state of the multiplier. enum MultiplierSpriteState { @@ -12,9 +87,10 @@ enum MultiplierSpriteState { /// {@template multiplier_sprite_group_component} /// A [SpriteGroupComponent] for the multiplier over the board. /// {@endtemplate} +@visibleForTesting class MultiplierSpriteGroupComponent extends SpriteGroupComponent with HasGameRef { - /// {@macro multiplier_sprite_group_component} + /// {@macro multiplier_sprite_group_component} MultiplierSpriteGroupComponent({ required Vector2 position, required String onAssetPath, diff --git a/packages/pinball_components/test/src/components/multiplier_test.dart b/packages/pinball_components/test/src/components/multiplier_test.dart index 27c729db..1f34aa58 100644 --- a/packages/pinball_components/test/src/components/multiplier_test.dart +++ b/packages/pinball_components/test/src/components/multiplier_test.dart @@ -29,18 +29,17 @@ void main() { 'x2 active', setUp: (game, tester) async { await game.images.loadAll(assets); - final multiplier = MultiplierSpriteGroupComponent( + final multiplier = Multiplier( + value: 2, position: Vector2.zero(), - onAssetPath: Assets.images.multiplier.x2.active.keyName, - offAssetPath: Assets.images.multiplier.x2.inactive.keyName, ); await game.ensureAdd(multiplier); - multiplier.current = MultiplierSpriteState.active; + multiplier.toggle(2); await tester.pump(); expect( - game.children + multiplier.children .whereType() .first .current, @@ -61,17 +60,16 @@ void main() { 'x2 inactive', setUp: (game, tester) async { await game.images.loadAll(assets); - await game.ensureAdd( - MultiplierSpriteGroupComponent( - position: Vector2.zero(), - onAssetPath: Assets.images.multiplier.x2.active.keyName, - offAssetPath: Assets.images.multiplier.x2.inactive.keyName, - ), + + final multiplier = Multiplier( + value: 2, + position: Vector2.zero(), ); + await game.ensureAdd(multiplier); await tester.pump(); expect( - game.children + multiplier.children .whereType() .first .current, @@ -92,18 +90,18 @@ void main() { 'x3 active', setUp: (game, tester) async { await game.images.loadAll(assets); - final multiplier = MultiplierSpriteGroupComponent( + + final multiplier = Multiplier( + value: 3, position: Vector2.zero(), - onAssetPath: Assets.images.multiplier.x3.active.keyName, - offAssetPath: Assets.images.multiplier.x3.inactive.keyName, ); await game.ensureAdd(multiplier); - multiplier.current = MultiplierSpriteState.active; + multiplier.toggle(3); await tester.pump(); expect( - game.children + multiplier.children .whereType() .first .current, @@ -124,17 +122,16 @@ void main() { 'x3 inactive', setUp: (game, tester) async { await game.images.loadAll(assets); - await game.ensureAdd( - MultiplierSpriteGroupComponent( - position: Vector2.zero(), - onAssetPath: Assets.images.multiplier.x3.active.keyName, - offAssetPath: Assets.images.multiplier.x3.inactive.keyName, - ), + + final multiplier = Multiplier( + value: 3, + position: Vector2.zero(), ); + await game.ensureAdd(multiplier); await tester.pump(); expect( - game.children + multiplier.children .whereType() .first .current, @@ -155,18 +152,18 @@ void main() { 'x4 active', setUp: (game, tester) async { await game.images.loadAll(assets); - final multiplier = MultiplierSpriteGroupComponent( + + final multiplier = Multiplier( + value: 4, position: Vector2.zero(), - onAssetPath: Assets.images.multiplier.x4.active.keyName, - offAssetPath: Assets.images.multiplier.x4.inactive.keyName, ); await game.ensureAdd(multiplier); - multiplier.current = MultiplierSpriteState.active; + multiplier.toggle(4); await tester.pump(); expect( - game.children + multiplier.children .whereType() .first .current, @@ -187,17 +184,16 @@ void main() { 'x4 inactive', setUp: (game, tester) async { await game.images.loadAll(assets); - await game.ensureAdd( - MultiplierSpriteGroupComponent( - position: Vector2.zero(), - onAssetPath: Assets.images.multiplier.x4.active.keyName, - offAssetPath: Assets.images.multiplier.x4.inactive.keyName, - ), + + final multiplier = Multiplier( + value: 4, + position: Vector2.zero(), ); + await game.ensureAdd(multiplier); await tester.pump(); expect( - game.children + multiplier.children .whereType() .first .current, @@ -218,18 +214,18 @@ void main() { 'x5 active', setUp: (game, tester) async { await game.images.loadAll(assets); - final multiplier = MultiplierSpriteGroupComponent( + + final multiplier = Multiplier( + value: 5, position: Vector2.zero(), - onAssetPath: Assets.images.multiplier.x5.active.keyName, - offAssetPath: Assets.images.multiplier.x5.inactive.keyName, ); await game.ensureAdd(multiplier); - multiplier.current = MultiplierSpriteState.active; + multiplier.toggle(5); await tester.pump(); expect( - game.children + multiplier.children .whereType() .first .current, @@ -250,17 +246,16 @@ void main() { 'x5 inactive', setUp: (game, tester) async { await game.images.loadAll(assets); - await game.ensureAdd( - MultiplierSpriteGroupComponent( - position: Vector2.zero(), - onAssetPath: Assets.images.multiplier.x5.active.keyName, - offAssetPath: Assets.images.multiplier.x5.inactive.keyName, - ), + + final multiplier = Multiplier( + value: 5, + position: Vector2.zero(), ); + await game.ensureAdd(multiplier); await tester.pump(); expect( - game.children + multiplier.children .whereType() .first .current, @@ -281,18 +276,18 @@ void main() { 'x6 active', setUp: (game, tester) async { await game.images.loadAll(assets); - final multiplier = MultiplierSpriteGroupComponent( + + final multiplier = Multiplier( + value: 6, position: Vector2.zero(), - onAssetPath: Assets.images.multiplier.x6.active.keyName, - offAssetPath: Assets.images.multiplier.x6.inactive.keyName, ); await game.ensureAdd(multiplier); - multiplier.current = MultiplierSpriteState.active; + multiplier.toggle(6); await tester.pump(); expect( - game.children + multiplier.children .whereType() .first .current, @@ -313,17 +308,16 @@ void main() { 'x6 inactive', setUp: (game, tester) async { await game.images.loadAll(assets); - await game.ensureAdd( - MultiplierSpriteGroupComponent( - position: Vector2.zero(), - onAssetPath: Assets.images.multiplier.x6.active.keyName, - offAssetPath: Assets.images.multiplier.x6.inactive.keyName, - ), + + final multiplier = Multiplier( + value: 6, + position: Vector2.zero(), ); + await game.ensureAdd(multiplier); await tester.pump(); expect( - game.children + multiplier.children .whereType() .first .current,