summaryrefslogtreecommitdiff
path: root/lib/screens/level.dart
diff options
context:
space:
mode:
Diffstat (limited to 'lib/screens/level.dart')
-rw-r--r--lib/screens/level.dart243
1 files changed, 118 insertions, 125 deletions
diff --git a/lib/screens/level.dart b/lib/screens/level.dart
index 16c7d11..e2b2195 100644
--- a/lib/screens/level.dart
+++ b/lib/screens/level.dart
@@ -72,35 +72,19 @@ class _LevelState extends State<Level> with SingleTickerProviderStateMixin {
_position = value;
}),
);
- _durationSubscription = player.onDurationChanged.listen((duration) {
+
+ // listen for new values from player
+ _durationSubscription =
+ player.onDurationChanged.listen((Duration duration) {
setState(() => _duration = duration);
});
- if (ESenseInput.instance.connected) {
- _buttonSubscription = ESenseInput.instance.buttonEvents().listen((event) {
- if (!event.pressed) {
- if (_isPlaying) {
- player.pause();
- setState(() {
- _isPlaying = false;
- });
- } else {
- player.resume();
- setState(() {
- _isPlaying = true;
- });
- }
- }
- });
- }
-
- _positionSubscription = player.onPositionChanged.listen(
- (p) => setState(() => _position = p),
- );
-
- player.onDurationChanged.listen((Duration d) {
- // print('Max duration: $d');
- setState(() => _duration = d);
+ _positionSubscription =
+ player.onPositionChanged.listen((Duration position) {
+ setState(() => _position = position);
+ for (final note in notes) {
+ _noteHitCheck(note, position);
+ }
});
player.onPlayerComplete.listen((void _) {
@@ -112,60 +96,16 @@ class _LevelState extends State<Level> with SingleTickerProviderStateMixin {
Navigator.pushReplacement(context, route);
});
- player.onPositionChanged.listen((Duration p) {
- // print('Current position: $p');
- setState(() => _position = p);
- for (final note in notes) {
- note.position = note.time - p.inMilliseconds / 60000.0;
- if (note.wasHit != null) {
- continue;
- }
- if (note.position.abs() < 0.5 * 1.0 / 60.0) {
- InputDirection esenseDirection =
- ESenseInput.instance.getInputDirection(note.direction);
- inputDirection.up |= esenseDirection.up;
- inputDirection.down |= esenseDirection.down;
- inputDirection.left |= esenseDirection.left;
- inputDirection.right |= esenseDirection.right;
- bool keypressCorrect = false;
- switch (note.direction) {
- case ArrowDirection.up:
- keypressCorrect = inputDirection.up;
- break;
- case ArrowDirection.down:
- keypressCorrect = inputDirection.down;
- break;
- case ArrowDirection.right:
- keypressCorrect = inputDirection.right;
- break;
- case ArrowDirection.left:
- keypressCorrect = inputDirection.left;
- break;
- }
- if (keypressCorrect) {
- print("you hit!");
- note.wasHit = true;
- _animationController.reset();
- _animationController.forward();
- inputDirection.reset();
- setState(() {
- hitOrMissMessage = 'Great!';
- });
- }
- } else if (note.position < -0.5 * 1.0 / 60.0) {
- print("Missed");
- note.wasHit = false;
- _animationController.reset();
- _animationController.forward();
- inputDirection.reset();
- setState(() {
- hitOrMissMessage = 'Missed';
- });
+ // listen for esense button and pause/resume
+ if (ESenseInput.instance.connected) {
+ _buttonSubscription = ESenseInput.instance.buttonEvents().listen((event) {
+ if (!event.pressed) {
+ _pauseResume();
}
- }
- });
+ });
+ }
- widget.simfile.chartSimplest!.beats.forEach((time, noteData) {
+ widget.simfile.chartSimplest?.beats.forEach((time, noteData) {
int arrowIndex = noteData.indexOf('1');
if (arrowIndex < 0 || arrowIndex > 3) {
return;
@@ -177,51 +117,114 @@ class _LevelState extends State<Level> with SingleTickerProviderStateMixin {
}
@override
+ void dispose() {
+ _animationController.dispose();
+ _durationSubscription?.cancel();
+ _positionSubscription?.cancel();
+ _buttonSubscription?.cancel();
+ player.dispose();
+ super.dispose();
+ }
+
+ void _pauseResume() {
+ if (_isPlaying) {
+ player.pause();
+ setState(() {
+ _isPlaying = false;
+ });
+ } else {
+ player.resume();
+ setState(() {
+ _isPlaying = true;
+ });
+ }
+ }
+
+ void _noteHitCheck(Note note, Duration time) {
+ note.position = note.time - time.inMilliseconds / 60000.0;
+ if (note.wasHit != null) {
+ return;
+ }
+ if (note.position.abs() < 0.5 * 1.0 / 60.0) {
+ InputDirection esenseDirection =
+ ESenseInput.instance.getInputDirection(note.direction);
+ inputDirection.up |= esenseDirection.up;
+ inputDirection.down |= esenseDirection.down;
+ inputDirection.left |= esenseDirection.left;
+ inputDirection.right |= esenseDirection.right;
+ bool keypressCorrect = false;
+ switch (note.direction) {
+ case ArrowDirection.up:
+ keypressCorrect = inputDirection.up;
+ break;
+ case ArrowDirection.down:
+ keypressCorrect = inputDirection.down;
+ break;
+ case ArrowDirection.right:
+ keypressCorrect = inputDirection.right;
+ break;
+ case ArrowDirection.left:
+ keypressCorrect = inputDirection.left;
+ break;
+ }
+ if (keypressCorrect) {
+ print("you hit!");
+ note.wasHit = true;
+ _animationController.reset();
+ _animationController.forward();
+ inputDirection.reset();
+ setState(() {
+ hitOrMissMessage = 'Great!';
+ });
+ }
+ } else if (note.position < -0.5 * 1.0 / 60.0) {
+ print("Missed");
+ note.wasHit = false;
+ _animationController.reset();
+ _animationController.forward();
+ inputDirection.reset();
+ setState(() {
+ hitOrMissMessage = 'Missed';
+ });
+ }
+ }
+
+ void _keyboardHandler(event) {
+ bool isDown = false;
+ if (event is KeyDownEvent) {
+ isDown = true;
+ } else if (event is KeyUpEvent) {
+ isDown = false;
+ } else {
+ return;
+ }
+ switch (event.logicalKey) {
+ case LogicalKeyboardKey.arrowUp:
+ inputDirection.up = isDown;
+ break;
+ case LogicalKeyboardKey.arrowDown:
+ inputDirection.down = isDown;
+ break;
+ case LogicalKeyboardKey.arrowLeft:
+ inputDirection.left = isDown;
+ break;
+ case LogicalKeyboardKey.arrowRight:
+ inputDirection.right = isDown;
+ break;
+ }
+ }
+
+ @override
Widget build(BuildContext context) {
return KeyboardListener(
focusNode: _focusNode,
autofocus: true,
- onKeyEvent: (event) {
- bool isDown = false;
- if (event is KeyDownEvent) {
- isDown = true;
- } else if (event is KeyUpEvent) {
- isDown = false;
- } else {
- return;
- }
- switch (event.logicalKey) {
- case LogicalKeyboardKey.arrowUp:
- inputDirection.up = isDown;
- break;
- case LogicalKeyboardKey.arrowDown:
- inputDirection.down = isDown;
- break;
- case LogicalKeyboardKey.arrowLeft:
- inputDirection.left = isDown;
- break;
- case LogicalKeyboardKey.arrowRight:
- inputDirection.right = isDown;
- break;
- }
- },
+ onKeyEvent: _keyboardHandler,
child: Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(_isPlaying ? Icons.pause : Icons.play_arrow),
- onPressed: () {
- if (_isPlaying) {
- player.pause();
- setState(() {
- _isPlaying = false;
- });
- } else {
- player.resume();
- setState(() {
- _isPlaying = true;
- });
- }
- },
+ onPressed: _pauseResume,
),
title: Text(widget.simfile.tags['TITLE']!),
actions: [
@@ -273,14 +276,4 @@ class _LevelState extends State<Level> with SingleTickerProviderStateMixin {
])),
);
}
-
- @override
- void dispose() {
- _animationController.dispose();
- _durationSubscription?.cancel();
- _positionSubscription?.cancel();
- _buttonSubscription?.cancel();
- player.dispose();
- super.dispose();
- }
}