feat: Refactor renderer key event handling and disable FPS counter by default

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-19 19:33:49 +01:00
parent 3e091c3d5d
commit bb1d04563a
6 changed files with 36 additions and 23 deletions

View File

@@ -90,25 +90,6 @@ class _GameScreenState extends State<GameScreen> {
), ),
), ),
// Tab toggles the renderer implementation for quick visual debugging.
Focus(
autofocus: true,
onKeyEvent: (node, event) {
if (event is KeyDownEvent) {
if (event.logicalKey == LogicalKeyboardKey.tab) {
setState(_cycleRendererMode);
return KeyEventResult.handled;
}
if (event.logicalKey == LogicalKeyboardKey.backquote) {
setState(_toggleFpsCounter);
return KeyEventResult.handled;
}
}
return KeyEventResult.ignored;
},
child: const SizedBox.shrink(),
),
// A second full-screen overlay keeps the presentation simple while // A second full-screen overlay keeps the presentation simple while
// the engine is still warming up or decoding the first frame. // the engine is still warming up or decoding the first frame.
if (!_engine.isInitialized) if (!_engine.isInitialized)
@@ -143,17 +124,40 @@ class _GameScreenState extends State<GameScreen> {
// reset level state or audio playback. // reset level state or audio playback.
switch (_rendererMode) { switch (_rendererMode) {
case _RendererMode.software: case _RendererMode.software:
return WolfFlutterRenderer(engine: _engine); return WolfFlutterRenderer(
engine: _engine,
onKeyEvent: _handleRendererKeyEvent,
);
case _RendererMode.ascii: case _RendererMode.ascii:
return WolfAsciiRenderer(engine: _engine); return WolfAsciiRenderer(
engine: _engine,
onKeyEvent: _handleRendererKeyEvent,
);
case _RendererMode.glsl: case _RendererMode.glsl:
return WolfGlslRenderer( return WolfGlslRenderer(
engine: _engine, engine: _engine,
onKeyEvent: _handleRendererKeyEvent,
onUnavailable: _onGlslUnavailable, onUnavailable: _onGlslUnavailable,
); );
} }
} }
void _handleRendererKeyEvent(KeyEvent event) {
if (event is! KeyDownEvent) {
return;
}
if (event.logicalKey == LogicalKeyboardKey.tab) {
setState(_cycleRendererMode);
return;
}
if (event.logicalKey == LogicalKeyboardKey.backquote ||
event.character == '`') {
setState(_toggleFpsCounter);
}
}
void _cycleRendererMode() { void _cycleRendererMode() {
switch (_rendererMode) { switch (_rendererMode) {
case _RendererMode.software: case _RendererMode.software:

View File

@@ -81,7 +81,7 @@ class WolfEngine {
double get fps => _smoothedFps; double get fps => _smoothedFps;
/// Whether renderers should draw the FPS counter overlay. /// Whether renderers should draw the FPS counter overlay.
bool showFpsCounter = true; bool showFpsCounter = false;
/// The episode index where the game session begins. /// The episode index where the game session begins.
final int? startingEpisode; final int? startingEpisode;

View File

@@ -10,9 +10,13 @@ abstract class BaseWolfRenderer extends StatefulWidget {
/// Engine instance that owns world state and the shared framebuffer. /// Engine instance that owns world state and the shared framebuffer.
final WolfEngine engine; final WolfEngine engine;
/// Optional key handler invoked by the focused renderer shell.
final void Function(KeyEvent event)? onKeyEvent;
/// Creates a renderer bound to [engine]. /// Creates a renderer bound to [engine].
const BaseWolfRenderer({ const BaseWolfRenderer({
required this.engine, required this.engine,
this.onKeyEvent,
super.key, super.key,
}); });
} }
@@ -75,7 +79,9 @@ abstract class BaseWolfRendererState<T extends BaseWolfRenderer>
body: KeyboardListener( body: KeyboardListener(
focusNode: focusNode, focusNode: focusNode,
autofocus: true, autofocus: true,
onKeyEvent: (_) {}, onKeyEvent: (event) {
widget.onKeyEvent?.call(event);
},
child: Center( child: Center(
child: buildViewport(context), child: buildViewport(context),
), ),

View File

@@ -10,6 +10,7 @@ class WolfAsciiRenderer extends BaseWolfRenderer {
/// Creates an ASCII renderer bound to [engine]. /// Creates an ASCII renderer bound to [engine].
const WolfAsciiRenderer({ const WolfAsciiRenderer({
required super.engine, required super.engine,
super.onKeyEvent,
super.key, super.key,
}); });

View File

@@ -14,6 +14,7 @@ class WolfFlutterRenderer extends BaseWolfRenderer {
/// Creates a pixel renderer bound to [engine]. /// Creates a pixel renderer bound to [engine].
const WolfFlutterRenderer({ const WolfFlutterRenderer({
required super.engine, required super.engine,
super.onKeyEvent,
super.key, super.key,
}); });

View File

@@ -17,6 +17,7 @@ class WolfGlslRenderer extends BaseWolfRenderer {
/// Creates a GLSL renderer bound to [engine]. /// Creates a GLSL renderer bound to [engine].
const WolfGlslRenderer({ const WolfGlslRenderer({
required super.engine, required super.engine,
super.onKeyEvent,
this.onUnavailable, this.onUnavailable,
super.key, super.key,
}); });