feat: animate hit or miss message instead of snackbar
This commit is contained in:
parent
c5cee0cb9d
commit
856949ceef
|
@ -1,5 +1,4 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:audioplayers/audioplayers.dart';
|
import 'package:audioplayers/audioplayers.dart';
|
||||||
|
@ -23,7 +22,7 @@ class InputDirection {
|
||||||
bool right = false;
|
bool right = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
class _LevelState extends State<Level> {
|
class _LevelState extends State<Level> with SingleTickerProviderStateMixin {
|
||||||
final player = AudioPlayer();
|
final player = AudioPlayer();
|
||||||
bool _isPlaying = true;
|
bool _isPlaying = true;
|
||||||
Duration? _duration;
|
Duration? _duration;
|
||||||
|
@ -35,8 +34,13 @@ class _LevelState extends State<Level> {
|
||||||
final FocusNode _focusNode = FocusNode();
|
final FocusNode _focusNode = FocusNode();
|
||||||
InputDirection inputDirection = InputDirection();
|
InputDirection inputDirection = InputDirection();
|
||||||
|
|
||||||
|
String hitOrMissMessage = 'Play!';
|
||||||
|
|
||||||
List<Note> notes = [];
|
List<Note> notes = [];
|
||||||
|
|
||||||
|
late AnimationController _animationController;
|
||||||
|
late Animation<double> _animation;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void setState(VoidCallback fn) {
|
void setState(VoidCallback fn) {
|
||||||
// Subscriptions only can be closed asynchronously,
|
// Subscriptions only can be closed asynchronously,
|
||||||
|
@ -49,6 +53,15 @@ class _LevelState extends State<Level> {
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.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
|
// Use initial values from player
|
||||||
player.getDuration().then(
|
player.getDuration().then(
|
||||||
(value) => setState(() {
|
(value) => setState(() {
|
||||||
|
@ -109,23 +122,20 @@ class _LevelState extends State<Level> {
|
||||||
if (keypressCorrect) {
|
if (keypressCorrect) {
|
||||||
print("you hit!");
|
print("you hit!");
|
||||||
note.wasHit = true;
|
note.wasHit = true;
|
||||||
|
_animationController.reset();
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
_animationController.forward();
|
||||||
SnackBar(
|
setState(() {
|
||||||
content: Text('Great!'),
|
hitOrMissMessage = 'Great!';
|
||||||
duration: Duration(milliseconds: 500),
|
});
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
} else if (note.position < -0.5 * 1.0 / 60.0) {
|
} else if (note.position < -0.5 * 1.0 / 60.0) {
|
||||||
print("Missed");
|
print("Missed");
|
||||||
note.wasHit = false;
|
note.wasHit = false;
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
_animationController.reset();
|
||||||
SnackBar(
|
_animationController.forward();
|
||||||
content: Text('Missed!'),
|
setState(() {
|
||||||
duration: Duration(milliseconds: 500),
|
hitOrMissMessage = 'Missed';
|
||||||
),
|
});
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -215,12 +225,15 @@ class _LevelState extends State<Level> {
|
||||||
top: 50,
|
top: 50,
|
||||||
width: MediaQuery.of(context).size.width,
|
width: MediaQuery.of(context).size.width,
|
||||||
left: 0,
|
left: 0,
|
||||||
|
child: FadeTransition(
|
||||||
|
opacity: _animation,
|
||||||
child: Text(
|
child: Text(
|
||||||
"Great!",
|
hitOrMissMessage,
|
||||||
textScaler: TextScaler.linear(4),
|
textScaler: TextScaler.linear(4),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
Positioned(
|
Positioned(
|
||||||
left: MediaQuery.of(context).size.width / 2 - 50,
|
left: MediaQuery.of(context).size.width / 2 - 50,
|
||||||
bottom: 50,
|
bottom: 50,
|
||||||
|
@ -238,6 +251,7 @@ class _LevelState extends State<Level> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
|
_animationController.dispose();
|
||||||
_durationSubscription?.cancel();
|
_durationSubscription?.cancel();
|
||||||
_positionSubscription?.cancel();
|
_positionSubscription?.cancel();
|
||||||
player.dispose();
|
player.dispose();
|
||||||
|
|
Loading…
Reference in a new issue