style: refactored level into smaller methods

This commit is contained in:
Orangerot 2025-01-13 15:16:08 +01:00
parent 7bf1ead030
commit d52f60ef92

View file

@ -72,35 +72,19 @@ class _LevelState extends State<Level> with SingleTickerProviderStateMixin {
_position = value; _position = value;
}), }),
); );
_durationSubscription = player.onDurationChanged.listen((duration) {
// listen for new values from player
_durationSubscription =
player.onDurationChanged.listen((Duration duration) {
setState(() => _duration = duration); setState(() => _duration = duration);
}); });
if (ESenseInput.instance.connected) { _positionSubscription =
_buttonSubscription = ESenseInput.instance.buttonEvents().listen((event) { player.onPositionChanged.listen((Duration position) {
if (!event.pressed) { setState(() => _position = position);
if (_isPlaying) { for (final note in notes) {
player.pause(); _noteHitCheck(note, position);
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);
}); });
player.onPlayerComplete.listen((void _) { player.onPlayerComplete.listen((void _) {
@ -112,60 +96,16 @@ class _LevelState extends State<Level> with SingleTickerProviderStateMixin {
Navigator.pushReplacement(context, route); Navigator.pushReplacement(context, route);
}); });
player.onPositionChanged.listen((Duration p) { // listen for esense button and pause/resume
// print('Current position: $p'); if (ESenseInput.instance.connected) {
setState(() => _position = p); _buttonSubscription = ESenseInput.instance.buttonEvents().listen((event) {
for (final note in notes) { if (!event.pressed) {
note.position = note.time - p.inMilliseconds / 60000.0; _pauseResume();
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';
});
}
}
});
widget.simfile.chartSimplest!.beats.forEach((time, noteData) { widget.simfile.chartSimplest?.beats.forEach((time, noteData) {
int arrowIndex = noteData.indexOf('1'); int arrowIndex = noteData.indexOf('1');
if (arrowIndex < 0 || arrowIndex > 3) { if (arrowIndex < 0 || arrowIndex > 3) {
return; return;
@ -176,52 +116,115 @@ class _LevelState extends State<Level> with SingleTickerProviderStateMixin {
player.play(DeviceFileSource(widget.simfile.audioPath!)); player.play(DeviceFileSource(widget.simfile.audioPath!));
} }
@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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return KeyboardListener( return KeyboardListener(
focusNode: _focusNode, focusNode: _focusNode,
autofocus: true, autofocus: true,
onKeyEvent: (event) { onKeyEvent: _keyboardHandler,
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;
}
},
child: Scaffold( child: Scaffold(
appBar: AppBar( appBar: AppBar(
leading: IconButton( leading: IconButton(
icon: Icon(_isPlaying ? Icons.pause : Icons.play_arrow), icon: Icon(_isPlaying ? Icons.pause : Icons.play_arrow),
onPressed: () { onPressed: _pauseResume,
if (_isPlaying) {
player.pause();
setState(() {
_isPlaying = false;
});
} else {
player.resume();
setState(() {
_isPlaying = true;
});
}
},
), ),
title: Text(widget.simfile.tags['TITLE']!), title: Text(widget.simfile.tags['TITLE']!),
actions: [ 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();
}
} }