import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; 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/wolf_3d_ascii_renderer.dart'; import 'package:wolf_3d_renderer/wolf_3d_flutter_renderer.dart'; class GameScreen extends StatefulWidget { final WolfensteinData data; final Difficulty difficulty; final int startingEpisode; final EngineAudio audio; const GameScreen({ required this.data, required this.difficulty, required this.startingEpisode, required this.audio, super.key, }); @override State createState() => _GameScreenState(); } class _GameScreenState extends State { late final WolfEngine _engine; late final Wolf3dInput _input; bool _useAsciiMode = false; @override void initState() { super.initState(); _input = Wolf3dFlutterInput(); // The Host Screen owns the engine lifecycle _engine = WolfEngine( data: widget.data, difficulty: widget.difficulty, startingEpisode: widget.startingEpisode, audio: widget.audio, input: _input, onGameWon: () => Navigator.of(context).pop(), ); _engine.init(); } @override Widget build(BuildContext context) { return Scaffold( body: Stack( children: [ // Render the active view _useAsciiMode ? WolfAsciiRenderer(engine: _engine) : WolfFlutterRenderer(engine: _engine), // Invisible listener to trap the 'Tab' key and swap renderers Focus( autofocus: false, onKeyEvent: (node, event) { if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.tab) { setState(() { _useAsciiMode = !_useAsciiMode; }); return KeyEventResult.handled; } return KeyEventResult.ignored; }, child: const SizedBox.shrink(), ), // Optional: A little UI hint Positioned( top: 16, right: 16, child: Text( 'Press TAB to swap renderers', style: TextStyle( color: Colors.white.withValues(alpha: 0.5), fontSize: 12, ), ), ), ], ), ); } }