Added ability to swap renderers

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-16 16:01:58 +01:00
parent f95c129522
commit 0963869b0c
5 changed files with 197 additions and 34 deletions

View File

@@ -0,0 +1,72 @@
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:wolf_3d_engine/wolf_3d_engine.dart';
import 'package:wolf_3d_input/wolf_3d_input.dart';
// 1. The widget now only requires the engine!
abstract class BaseWolfRenderer extends StatefulWidget {
final WolfEngine engine;
final Wolf3dInput inputManager;
const BaseWolfRenderer({
required this.engine,
required this.inputManager,
super.key,
});
}
abstract class BaseWolfRendererState<T extends BaseWolfRenderer>
extends State<T>
with SingleTickerProviderStateMixin {
late final Ticker gameLoop;
final FocusNode focusNode = FocusNode();
Duration _lastTick = Duration.zero;
@override
void initState() {
super.initState();
// DO NOT initialize the engine here. Just start the loop!
gameLoop = createTicker(_tick)..start();
focusNode.requestFocus();
}
void _tick(Duration elapsed) {
if (!widget.engine.isInitialized) return;
Duration delta = elapsed - _lastTick;
_lastTick = elapsed;
widget.inputManager.update();
// Tick the shared engine
widget.engine.tick(delta, widget.inputManager.currentInput);
performRender();
}
@override
void dispose() {
gameLoop.dispose();
focusNode.dispose();
super.dispose();
}
void performRender();
Widget buildViewport(BuildContext context);
Color get scaffoldColor;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: scaffoldColor,
body: KeyboardListener(
focusNode: focusNode,
autofocus: true,
onKeyEvent: (_) {},
child: Center(
child: buildViewport(context),
),
),
);
}
}

View File

@@ -4,21 +4,15 @@ import 'package:wolf_3d_data_types/wolf_3d_data_types.dart';
import 'package:wolf_3d_engine/wolf_3d_engine.dart';
import 'package:wolf_3d_flutter/wolf_3d_input_flutter.dart';
import 'package:wolf_3d_input/wolf_3d_input.dart';
import 'package:wolf_3d_renderer/base_renderer.dart';
class WolfAsciiRenderer extends StatefulWidget {
const WolfAsciiRenderer(
this.data, {
required this.difficulty,
required this.startingEpisode,
required this.audio,
class WolfAsciiRenderer extends BaseWolfRenderer {
const WolfAsciiRenderer({
required super.engine,
required super.inputManager,
super.key,
});
final WolfensteinData data;
final Difficulty difficulty;
final int startingEpisode;
final EngineAudio audio;
@override
State<WolfAsciiRenderer> createState() => _WolfAsciiRendererState();
}
@@ -41,10 +35,10 @@ class _WolfAsciiRendererState extends State<WolfAsciiRenderer>
super.initState();
engine = WolfEngine(
data: widget.data,
difficulty: widget.difficulty,
startingEpisode: widget.startingEpisode,
audio: widget.audio,
data: widget.engine.data,
difficulty: widget.engine.difficulty,
startingEpisode: widget.engine.startingEpisode,
audio: widget.engine.audio,
onGameWon: () {
Navigator.of(context).pop();
},
@@ -86,7 +80,7 @@ class _WolfAsciiRendererState extends State<WolfAsciiRenderer>
}
return Scaffold(
backgroundColor: Colors.black,
backgroundColor: Color.fromARGB(255, 4, 64, 64),
body: KeyboardListener(
focusNode: _focusNode,
autofocus: true,

View File

@@ -6,21 +6,15 @@ import 'package:wolf_3d_data_types/wolf_3d_data_types.dart';
import 'package:wolf_3d_engine/wolf_3d_engine.dart';
import 'package:wolf_3d_flutter/wolf_3d_input_flutter.dart';
import 'package:wolf_3d_input/wolf_3d_input.dart';
import 'package:wolf_3d_renderer/base_renderer.dart';
class WolfFlutterRenderer extends StatefulWidget {
const WolfFlutterRenderer(
this.data, {
required this.difficulty,
required this.startingEpisode,
required this.audio,
class WolfFlutterRenderer extends BaseWolfRenderer {
const WolfFlutterRenderer({
required super.engine,
required super.inputManager,
super.key,
});
final WolfensteinData data;
final Difficulty difficulty;
final int startingEpisode;
final EngineAudio audio;
@override
State<WolfFlutterRenderer> createState() => _WolfFlutterRendererState();
}
@@ -47,10 +41,10 @@ class _WolfFlutterRendererState extends State<WolfFlutterRenderer>
super.initState();
engine = WolfEngine(
data: widget.data,
difficulty: widget.difficulty,
startingEpisode: widget.startingEpisode,
audio: widget.audio,
data: widget.engine.data,
difficulty: widget.engine.difficulty,
startingEpisode: widget.engine.startingEpisode,
audio: widget.engine.audio,
onGameWon: () {
Navigator.of(context).pop();
},