diff --git a/packages/pinball_components/assets/images/alien_bumper/a/active.png b/packages/pinball_components/assets/images/alien_bumper/a/active.png new file mode 100644 index 00000000..92943dfc Binary files /dev/null and b/packages/pinball_components/assets/images/alien_bumper/a/active.png differ diff --git a/packages/pinball_components/assets/images/alien_bumper/a/inactive.png b/packages/pinball_components/assets/images/alien_bumper/a/inactive.png new file mode 100644 index 00000000..99745fcf Binary files /dev/null and b/packages/pinball_components/assets/images/alien_bumper/a/inactive.png differ diff --git a/packages/pinball_components/assets/images/alien_bumper/b/active.png b/packages/pinball_components/assets/images/alien_bumper/b/active.png new file mode 100644 index 00000000..ec7dc0cb Binary files /dev/null and b/packages/pinball_components/assets/images/alien_bumper/b/active.png differ diff --git a/packages/pinball_components/assets/images/alien_bumper/b/inactive.png b/packages/pinball_components/assets/images/alien_bumper/b/inactive.png new file mode 100644 index 00000000..23f7f4b7 Binary files /dev/null and b/packages/pinball_components/assets/images/alien_bumper/b/inactive.png differ diff --git a/packages/pinball_components/lib/gen/assets.gen.dart b/packages/pinball_components/lib/gen/assets.gen.dart index 518d3237..7762160c 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -10,6 +10,9 @@ import 'package:flutter/widgets.dart'; class $AssetsImagesGen { const $AssetsImagesGen(); + $AssetsImagesAlienBumperGen get alienBumper => + const $AssetsImagesAlienBumperGen(); + /// File path: assets/images/ball.png AssetGenImage get ball => const AssetGenImage('assets/images/ball.png'); @@ -35,6 +38,13 @@ class $AssetsImagesGen { const $AssetsImagesSparkyBumperGen(); } +class $AssetsImagesAlienBumperGen { + const $AssetsImagesAlienBumperGen(); + + $AssetsImagesAlienBumperAGen get a => const $AssetsImagesAlienBumperAGen(); + $AssetsImagesAlienBumperBGen get b => const $AssetsImagesAlienBumperBGen(); +} + class $AssetsImagesBaseboardGen { const $AssetsImagesBaseboardGen(); @@ -173,6 +183,30 @@ class $AssetsImagesSparkyBumperGen { $AssetsImagesSparkyBumperCGen get c => const $AssetsImagesSparkyBumperCGen(); } +class $AssetsImagesAlienBumperAGen { + const $AssetsImagesAlienBumperAGen(); + + /// File path: assets/images/alien_bumper/a/active.png + AssetGenImage get active => + const AssetGenImage('assets/images/alien_bumper/a/active.png'); + + /// File path: assets/images/alien_bumper/a/inactive.png + AssetGenImage get inactive => + const AssetGenImage('assets/images/alien_bumper/a/inactive.png'); +} + +class $AssetsImagesAlienBumperBGen { + const $AssetsImagesAlienBumperBGen(); + + /// File path: assets/images/alien_bumper/b/active.png + AssetGenImage get active => + const AssetGenImage('assets/images/alien_bumper/b/active.png'); + + /// File path: assets/images/alien_bumper/b/inactive.png + AssetGenImage get inactive => + const AssetGenImage('assets/images/alien_bumper/b/inactive.png'); +} + class $AssetsImagesDashBumperAGen { const $AssetsImagesDashBumperAGen(); diff --git a/packages/pinball_components/lib/src/components/alien_bumper.dart b/packages/pinball_components/lib/src/components/alien_bumper.dart new file mode 100644 index 00000000..e2be4162 --- /dev/null +++ b/packages/pinball_components/lib/src/components/alien_bumper.dart @@ -0,0 +1,112 @@ +import 'dart:math' as math; + +import 'package:flame/components.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball_components/pinball_components.dart'; + +/// {@template alien_bumper} +/// Bumper for Alien area. +/// {@endtemplate} +// TODO(ruimiguel): refactor later to unify with DashBumpers. +class AlienBumper extends BodyComponent with InitialPosition { + /// {@macro alien_bumper} + AlienBumper._({ + required double majorRadius, + required double minorRadius, + required String activeAssetPath, + required String inactiveAssetPath, + required SpriteComponent spriteComponent, + }) : _majorRadius = majorRadius, + _minorRadius = minorRadius, + _activeAssetPath = activeAssetPath, + _inactiveAssetPath = inactiveAssetPath, + _spriteComponent = spriteComponent; + + /// {@macro alien_bumper} + AlienBumper.a() + : this._( + majorRadius: 2.9, + minorRadius: 2.1, + activeAssetPath: Assets.images.alienBumper.a.active.keyName, + inactiveAssetPath: Assets.images.alienBumper.a.inactive.keyName, + spriteComponent: SpriteComponent( + anchor: Anchor.center, + position: Vector2(0, -0.25), + ), + ); + + /// {@macro alien_bumper} + AlienBumper.b() + : this._( + majorRadius: 2.85, + minorRadius: 2, + activeAssetPath: Assets.images.alienBumper.b.active.keyName, + inactiveAssetPath: Assets.images.alienBumper.b.inactive.keyName, + spriteComponent: SpriteComponent( + anchor: Anchor.center, + position: Vector2(0, -0.35), + ), + ); + + final double _majorRadius; + final double _minorRadius; + final String _activeAssetPath; + late final Sprite _activeSprite; + final String _inactiveAssetPath; + late final Sprite _inactiveSprite; + final SpriteComponent _spriteComponent; + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprites(); + + // TODO(erickzanardo): Look into using onNewState instead. + // Currently doing: onNewState(gameRef.read()) will throw an + // `Exception: build context is not available yet` + deactivate(); + await add(_spriteComponent); + } + + @override + Body createBody() { + renderBody = false; + + final shape = EllipseShape( + center: Vector2.zero(), + majorRadius: _majorRadius, + minorRadius: _minorRadius, + )..rotate(math.pi / 1.9); + final fixtureDef = FixtureDef(shape) + ..friction = 0 + ..restitution = 4; + + final bodyDef = BodyDef() + ..position = initialPosition + ..userData = this; + + return world.createBody(bodyDef)..createFixture(fixtureDef); + } + + Future _loadSprites() async { + // TODO(alestiago): I think ideally we would like to do: + // Sprite(path).load so we don't require to store the activeAssetPath and + // the inactive assetPath. + _inactiveSprite = await gameRef.loadSprite(_inactiveAssetPath); + _activeSprite = await gameRef.loadSprite(_activeAssetPath); + } + + /// Activates the [AlienBumper]. + void activate() { + _spriteComponent + ..sprite = _activeSprite + ..size = _activeSprite.originalSize / 10; + } + + /// Deactivates the [AlienBumper]. + void deactivate() { + _spriteComponent + ..sprite = _inactiveSprite + ..size = _inactiveSprite.originalSize / 10; + } +} diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index 14d657d5..19fb170e 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -1,3 +1,4 @@ +export 'alien_bumper.dart'; export 'ball.dart'; export 'baseboard.dart'; export 'board_dimensions.dart'; diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index b6f71b8b..63428ff8 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -43,6 +43,8 @@ flutter: - assets/images/sparky_bumper/a/ - assets/images/sparky_bumper/b/ - assets/images/sparky_bumper/c/ + - assets/images/alien_bumper/a/ + - assets/images/alien_bumper/b/ flutter_gen: line_length: 80