commit 856949ceef752ed22a7fd968432ab052a00348a8
parent c5cee0cb9d16aae1a4fcf1a00d0def9806c33d71
Author: Orangerot <purple@orangerot.dev>
Date: Wed, 8 Jan 2025 10:41:22 +0100
feat: animate hit or miss message instead of snackbar
Diffstat:
| M | lib/level.dart | | | 52 | +++++++++++++++++++++++++++++++++------------------- |
1 file changed, 33 insertions(+), 19 deletions(-)
diff --git a/lib/level.dart b/lib/level.dart
@@ -1,5 +1,4 @@
import 'dart:async';
-import 'dart:io';
import 'package:flutter/material.dart';
import 'package:audioplayers/audioplayers.dart';
@@ -23,7 +22,7 @@ class InputDirection {
bool right = false;
}
-class _LevelState extends State<Level> {
+class _LevelState extends State<Level> with SingleTickerProviderStateMixin {
final player = AudioPlayer();
bool _isPlaying = true;
Duration? _duration;
@@ -35,8 +34,13 @@ class _LevelState extends State<Level> {
final FocusNode _focusNode = FocusNode();
InputDirection inputDirection = InputDirection();
+ String hitOrMissMessage = 'Play!';
+
List<Note> notes = [];
+ late AnimationController _animationController;
+ late Animation<double> _animation;
+
@override
void setState(VoidCallback fn) {
// Subscriptions only can be closed asynchronously,
@@ -49,6 +53,15 @@ class _LevelState extends State<Level> {
@override
void initState() {
super.initState();
+
+ _animationController = AnimationController(
+ vsync: this,
+ duration: Duration(seconds: 2),
+ );
+ _animation =
+ Tween<double>(begin: 1.0, end: 0.0).animate(_animationController);
+ _animationController.forward();
+
// Use initial values from player
player.getDuration().then(
(value) => setState(() {
@@ -109,23 +122,20 @@ class _LevelState extends State<Level> {
if (keypressCorrect) {
print("you hit!");
note.wasHit = true;
-
- ScaffoldMessenger.of(context).showSnackBar(
- SnackBar(
- content: Text('Great!'),
- duration: Duration(milliseconds: 500),
- ),
- );
+ _animationController.reset();
+ _animationController.forward();
+ setState(() {
+ hitOrMissMessage = 'Great!';
+ });
}
} else if (note.position < -0.5 * 1.0 / 60.0) {
print("Missed");
note.wasHit = false;
- ScaffoldMessenger.of(context).showSnackBar(
- SnackBar(
- content: Text('Missed!'),
- duration: Duration(milliseconds: 500),
- ),
- );
+ _animationController.reset();
+ _animationController.forward();
+ setState(() {
+ hitOrMissMessage = 'Missed';
+ });
}
}
});
@@ -215,10 +225,13 @@ class _LevelState extends State<Level> {
top: 50,
width: MediaQuery.of(context).size.width,
left: 0,
- child: Text(
- "Great!",
- textScaler: TextScaler.linear(4),
- textAlign: TextAlign.center,
+ child: FadeTransition(
+ opacity: _animation,
+ child: Text(
+ hitOrMissMessage,
+ textScaler: TextScaler.linear(4),
+ textAlign: TextAlign.center,
+ ),
),
),
Positioned(
@@ -238,6 +251,7 @@ class _LevelState extends State<Level> {
@override
void dispose() {
+ _animationController.dispose();
_durationSubscription?.cancel();
_positionSubscription?.cancel();
player.dispose();