refactor: Update renderer mode enum and input key handling for improved clarity
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
@@ -10,10 +10,10 @@ import 'package:wolf_3d_renderer/wolf_3d_ascii_renderer.dart';
|
|||||||
import 'package:wolf_3d_renderer/wolf_3d_flutter_renderer.dart';
|
import 'package:wolf_3d_renderer/wolf_3d_flutter_renderer.dart';
|
||||||
import 'package:wolf_3d_renderer/wolf_3d_glsl_renderer.dart';
|
import 'package:wolf_3d_renderer/wolf_3d_glsl_renderer.dart';
|
||||||
|
|
||||||
enum _RendererMode {
|
enum RendererMode {
|
||||||
software,
|
software,
|
||||||
ascii,
|
ascii,
|
||||||
glsl,
|
hardware,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Launches a [WolfEngine] via [Wolf3d] and exposes renderer/input integrations.
|
/// Launches a [WolfEngine] via [Wolf3d] and exposes renderer/input integrations.
|
||||||
@@ -33,7 +33,7 @@ class GameScreen extends StatefulWidget {
|
|||||||
|
|
||||||
class _GameScreenState extends State<GameScreen> {
|
class _GameScreenState extends State<GameScreen> {
|
||||||
late final WolfEngine _engine;
|
late final WolfEngine _engine;
|
||||||
_RendererMode _rendererMode = _RendererMode.software;
|
RendererMode _rendererMode = RendererMode.hardware;
|
||||||
AsciiTheme _asciiTheme = AsciiThemes.blocks;
|
AsciiTheme _asciiTheme = AsciiThemes.blocks;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -109,7 +109,7 @@ class _GameScreenState extends State<GameScreen> {
|
|||||||
top: 16,
|
top: 16,
|
||||||
right: 16,
|
right: 16,
|
||||||
child: Text(
|
child: Text(
|
||||||
'TAB: ${_modeLabel(_rendererMode)} T: ${_asciiTheme.name} `: FPS ${_engine.showFpsCounter ? 'On' : 'Off'}',
|
'<${widget.wolf3d.input.rendererToggleKeyLabel}> ${_rendererMode.name}${_rendererMode == RendererMode.ascii ? ' <${widget.wolf3d.input.asciiThemeCycleKeyLabel}> ${_asciiTheme.name}' : ''} <${widget.wolf3d.input.fpsToggleKeyLabel}> FPS ${_engine.showFpsCounter ? 'On' : 'Off'}',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.white.withValues(alpha: 0.5),
|
color: Colors.white.withValues(alpha: 0.5),
|
||||||
),
|
),
|
||||||
@@ -128,18 +128,18 @@ class _GameScreenState extends State<GameScreen> {
|
|||||||
// Keep all renderers behind the same engine so mode switching does not
|
// Keep all renderers behind the same engine so mode switching does not
|
||||||
// reset level state or audio playback.
|
// reset level state or audio playback.
|
||||||
switch (_rendererMode) {
|
switch (_rendererMode) {
|
||||||
case _RendererMode.software:
|
case RendererMode.software:
|
||||||
return WolfFlutterRenderer(
|
return WolfFlutterRenderer(
|
||||||
engine: _engine,
|
engine: _engine,
|
||||||
onKeyEvent: _handleRendererKeyEvent,
|
onKeyEvent: _handleRendererKeyEvent,
|
||||||
);
|
);
|
||||||
case _RendererMode.ascii:
|
case RendererMode.ascii:
|
||||||
return WolfAsciiRenderer(
|
return WolfAsciiRenderer(
|
||||||
engine: _engine,
|
engine: _engine,
|
||||||
theme: _asciiTheme,
|
theme: _asciiTheme,
|
||||||
onKeyEvent: _handleRendererKeyEvent,
|
onKeyEvent: _handleRendererKeyEvent,
|
||||||
);
|
);
|
||||||
case _RendererMode.glsl:
|
case RendererMode.hardware:
|
||||||
return WolfGlslRenderer(
|
return WolfGlslRenderer(
|
||||||
engine: _engine,
|
engine: _engine,
|
||||||
onKeyEvent: _handleRendererKeyEvent,
|
onKeyEvent: _handleRendererKeyEvent,
|
||||||
@@ -153,44 +153,41 @@ class _GameScreenState extends State<GameScreen> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.logicalKey == LogicalKeyboardKey.tab) {
|
if (event.logicalKey == widget.wolf3d.input.rendererToggleKey) {
|
||||||
setState(_cycleRendererMode);
|
setState(_cycleRendererMode);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.logicalKey == LogicalKeyboardKey.backquote ||
|
if (event.logicalKey == widget.wolf3d.input.fpsToggleKey) {
|
||||||
event.character == '`') {
|
|
||||||
setState(_toggleFpsCounter);
|
setState(_toggleFpsCounter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.logicalKey == LogicalKeyboardKey.keyT ||
|
if (event.logicalKey == widget.wolf3d.input.asciiThemeCycleKey) {
|
||||||
event.character == 't' ||
|
|
||||||
event.character == 'T') {
|
|
||||||
setState(_cycleAsciiTheme);
|
setState(_cycleAsciiTheme);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _cycleRendererMode() {
|
void _cycleRendererMode() {
|
||||||
switch (_rendererMode) {
|
switch (_rendererMode) {
|
||||||
case _RendererMode.software:
|
case RendererMode.hardware:
|
||||||
_rendererMode = _RendererMode.ascii;
|
_rendererMode = RendererMode.software;
|
||||||
break;
|
break;
|
||||||
case _RendererMode.ascii:
|
case RendererMode.software:
|
||||||
_rendererMode = _RendererMode.glsl;
|
_rendererMode = RendererMode.ascii;
|
||||||
break;
|
break;
|
||||||
case _RendererMode.glsl:
|
case RendererMode.ascii:
|
||||||
_rendererMode = _RendererMode.software;
|
_rendererMode = RendererMode.hardware;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onGlslUnavailable() {
|
void _onGlslUnavailable() {
|
||||||
if (!mounted || _rendererMode != _RendererMode.glsl) {
|
if (!mounted || _rendererMode != RendererMode.hardware) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setState(() {
|
setState(() {
|
||||||
_rendererMode = _RendererMode.software;
|
_rendererMode = RendererMode.software;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,15 +198,4 @@ class _GameScreenState extends State<GameScreen> {
|
|||||||
void _cycleAsciiTheme() {
|
void _cycleAsciiTheme() {
|
||||||
_asciiTheme = AsciiThemes.nextOf(_asciiTheme);
|
_asciiTheme = AsciiThemes.nextOf(_asciiTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
String _modeLabel(_RendererMode mode) {
|
|
||||||
switch (mode) {
|
|
||||||
case _RendererMode.software:
|
|
||||||
return 'Software';
|
|
||||||
case _RendererMode.ascii:
|
|
||||||
return 'ASCII';
|
|
||||||
case _RendererMode.glsl:
|
|
||||||
return 'GLSL';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,43 @@ import 'package:wolf_3d_dart/wolf_3d_input.dart';
|
|||||||
|
|
||||||
/// Translates Flutter keyboard and mouse state into engine-friendly actions.
|
/// Translates Flutter keyboard and mouse state into engine-friendly actions.
|
||||||
class Wolf3dFlutterInput extends Wolf3dInput {
|
class Wolf3dFlutterInput extends Wolf3dInput {
|
||||||
|
/// Keyboard shortcut used by the Flutter host to cycle renderer modes.
|
||||||
|
LogicalKeyboardKey rendererToggleKey = LogicalKeyboardKey.keyR;
|
||||||
|
|
||||||
|
/// Keyboard shortcut used by the Flutter host to cycle ASCII themes.
|
||||||
|
LogicalKeyboardKey asciiThemeCycleKey = LogicalKeyboardKey.keyT;
|
||||||
|
|
||||||
|
/// Keyboard shortcut used by the Flutter host to toggle the FPS counter.
|
||||||
|
LogicalKeyboardKey fpsToggleKey = LogicalKeyboardKey.backquote;
|
||||||
|
|
||||||
|
/// Human-friendly label for [rendererToggleKey] shown in on-screen hints.
|
||||||
|
String get rendererToggleKeyLabel => _formatShortcutLabel(rendererToggleKey);
|
||||||
|
|
||||||
|
/// Human-friendly label for [asciiThemeCycleKey] shown in on-screen hints.
|
||||||
|
String get asciiThemeCycleKeyLabel =>
|
||||||
|
_formatShortcutLabel(asciiThemeCycleKey);
|
||||||
|
|
||||||
|
/// Human-friendly label for [fpsToggleKey] shown in on-screen hints.
|
||||||
|
String get fpsToggleKeyLabel => _formatShortcutLabel(fpsToggleKey);
|
||||||
|
|
||||||
|
String _formatShortcutLabel(LogicalKeyboardKey key) {
|
||||||
|
if (key == LogicalKeyboardKey.space) {
|
||||||
|
return 'SPACE';
|
||||||
|
}
|
||||||
|
if (key == LogicalKeyboardKey.tab) {
|
||||||
|
return 'TAB';
|
||||||
|
}
|
||||||
|
final label = key.keyLabel;
|
||||||
|
if (label.isNotEmpty) {
|
||||||
|
return label.toUpperCase();
|
||||||
|
}
|
||||||
|
final debugName = key.debugName;
|
||||||
|
if (debugName == null || debugName.isEmpty) {
|
||||||
|
return 'KEY';
|
||||||
|
}
|
||||||
|
return debugName.replaceFirst('Logical Keyboard Key ', '').toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
/// Mapping from logical game actions to one or more keyboard bindings.
|
/// Mapping from logical game actions to one or more keyboard bindings.
|
||||||
///
|
///
|
||||||
/// Each action can be rebound by replacing the matching set. The defaults
|
/// Each action can be rebound by replacing the matching set. The defaults
|
||||||
|
|||||||
Reference in New Issue
Block a user