feat: Implement ASCII theme cycling and add quadrant theme support

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-19 23:29:00 +01:00
parent aab79b5c50
commit add8bcfde1
6 changed files with 219 additions and 11 deletions

View File

@@ -125,9 +125,36 @@ class CliGameLoop {
return;
}
if (bytes.contains(116) || bytes.contains(84)) {
_cycleAsciiTheme();
return;
}
input.handleKey(bytes);
}
void _cycleAsciiTheme() {
final List<AsciiRenderer> asciiRenderers = <AsciiRenderer>[
if (primaryRenderer is AsciiRenderer) primaryRenderer as AsciiRenderer,
if (secondaryRenderer is AsciiRenderer)
secondaryRenderer as AsciiRenderer,
];
if (asciiRenderers.isEmpty) {
return;
}
final AsciiTheme nextTheme = AsciiThemes.nextOf(
asciiRenderers.first.activeTheme,
);
for (final renderer in asciiRenderers) {
renderer.activeTheme = nextTheme;
}
if (stdout.hasTerminal) {
stdout.write('\x1b[2J\x1b[H');
}
}
void _tick(Timer timer) {
if (!_isRunning) {
return;

View File

@@ -4,6 +4,7 @@ library;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:wolf_3d_dart/wolf_3d_engine.dart';
import 'package:wolf_3d_dart/wolf_3d_renderer.dart';
import 'package:wolf_3d_flutter/wolf_3d_flutter.dart';
import 'package:wolf_3d_renderer/wolf_3d_ascii_renderer.dart';
import 'package:wolf_3d_renderer/wolf_3d_flutter_renderer.dart';
@@ -33,6 +34,7 @@ class GameScreen extends StatefulWidget {
class _GameScreenState extends State<GameScreen> {
late final WolfEngine _engine;
_RendererMode _rendererMode = _RendererMode.software;
AsciiTheme _asciiTheme = AsciiThemes.blocks;
@override
void initState() {
@@ -104,7 +106,7 @@ class _GameScreenState extends State<GameScreen> {
top: 16,
right: 16,
child: Text(
'TAB: ${_modeLabel(_rendererMode)} `: FPS ${_engine.showFpsCounter ? 'On' : 'Off'}',
'TAB: ${_modeLabel(_rendererMode)} T: ${_asciiTheme.name} `: FPS ${_engine.showFpsCounter ? 'On' : 'Off'}',
style: TextStyle(
color: Colors.white.withValues(alpha: 0.5),
),
@@ -131,6 +133,7 @@ class _GameScreenState extends State<GameScreen> {
case _RendererMode.ascii:
return WolfAsciiRenderer(
engine: _engine,
theme: _asciiTheme,
onKeyEvent: _handleRendererKeyEvent,
);
case _RendererMode.glsl:
@@ -155,6 +158,13 @@ class _GameScreenState extends State<GameScreen> {
if (event.logicalKey == LogicalKeyboardKey.backquote ||
event.character == '`') {
setState(_toggleFpsCounter);
return;
}
if (event.logicalKey == LogicalKeyboardKey.keyT ||
event.character == 't' ||
event.character == 'T') {
setState(_cycleAsciiTheme);
}
}
@@ -185,6 +195,10 @@ class _GameScreenState extends State<GameScreen> {
_engine.showFpsCounter = !_engine.showFpsCounter;
}
void _cycleAsciiTheme() {
_asciiTheme = AsciiThemes.nextOf(_asciiTheme);
}
String _modeLabel(_RendererMode mode) {
switch (mode) {
case _RendererMode.software: