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:
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user