From 2130d5ea9df277924a0fc3b285dd5c79d243d6fa Mon Sep 17 00:00:00 2001 From: alestiago Date: Wed, 20 Apr 2022 13:41:33 +0100 Subject: [PATCH] feat: allowed progressing sprite --- .../lib/src/components/flutter_sign_post.dart | 60 ++++++++++++++++--- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/packages/pinball_components/lib/src/components/flutter_sign_post.dart b/packages/pinball_components/lib/src/components/flutter_sign_post.dart index 819e008e..5c72e77f 100644 --- a/packages/pinball_components/lib/src/components/flutter_sign_post.dart +++ b/packages/pinball_components/lib/src/components/flutter_sign_post.dart @@ -2,6 +2,33 @@ import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:pinball_components/pinball_components.dart'; +enum _SignPostSpriteState { + inactive, + active1, + active2, + active3, +} + +extension on _SignPostSpriteState { + String get path { + switch (this) { + case _SignPostSpriteState.inactive: + return Assets.images.signPost.inactive.keyName; + case _SignPostSpriteState.active1: + return Assets.images.signPost.active1.keyName; + case _SignPostSpriteState.active2: + return Assets.images.signPost.active2.keyName; + case _SignPostSpriteState.active3: + return Assets.images.signPost.active3.keyName; + } + } + + _SignPostSpriteState get next { + return _SignPostSpriteState + .values[(index + 1) % _SignPostSpriteState.values.length]; + } +} + /// {@template flutter_sign_post} /// A sign, found in the Flutter Forest. /// {@endtemplate} @@ -15,6 +42,11 @@ class FlutterSignPost extends BodyComponent with InitialPosition { renderBody = false; } + /// Forwards the sprite to the next [_SignPostSpriteState]. + /// + /// If the current state is the last one it goes back to the initial state. + void progress() => firstChild<_FlutterSignPostSpriteComponent>()!.progress(); + @override Body createBody() { final shape = CircleShape()..radius = 0.25; @@ -27,17 +59,29 @@ class FlutterSignPost extends BodyComponent with InitialPosition { } } -class _FlutterSignPostSpriteComponent extends SpriteComponent with HasGameRef { +class _FlutterSignPostSpriteComponent + extends SpriteGroupComponent<_SignPostSpriteState> with HasGameRef { + _FlutterSignPostSpriteComponent() + : super( + anchor: Anchor.bottomCenter, + position: Vector2(0.65, 0.45), + ); + + void progress() => current = current?.next; + @override Future onLoad() async { await super.onLoad(); - final sprite = await gameRef.loadSprite( - Assets.images.signPost.inactive.keyName, - ); - this.sprite = sprite; - size = sprite.originalSize / 10; - anchor = Anchor.bottomCenter; - position = Vector2(0.65, 0.45); + final sprites = <_SignPostSpriteState, Sprite>{}; + this.sprites = sprites; + for (final spriteState in _SignPostSpriteState.values) { + sprites[spriteState] = Sprite( + gameRef.images.fromCache(spriteState.path), + ); + } + + current = _SignPostSpriteState.inactive; + size = sprites[current]!.originalSize / 10; } }