From aa686fb016b6f46c1310892ca1baca270c4f88d1 Mon Sep 17 00:00:00 2001 From: Hans Kokx Date: Sat, 14 Mar 2026 00:12:34 +0100 Subject: [PATCH] Further clean up _tick Signed-off-by: Hans Kokx --- lib/features/renderer/renderer.dart | 147 ++++++++++++++++------------ 1 file changed, 85 insertions(+), 62 deletions(-) diff --git a/lib/features/renderer/renderer.dart b/lib/features/renderer/renderer.dart index 6a4661d..fdccf81 100644 --- a/lib/features/renderer/renderer.dart +++ b/lib/features/renderer/renderer.dart @@ -192,76 +192,22 @@ class _WolfRendererState extends State } void _tick(Duration elapsed) { - // 1. Process all hardware inputs and player intentions + // 1. Inputs & Intentions _processInputs(elapsed); - // 2. Animate weapon lowering/raising + // 2. State Updates player.updateWeaponSwitch(); + _updateDoors(); + _applyMovementAndCollision(); + _updateEntities(elapsed); + _updateScreenEffects(); - // 3. Animate doors sliding - doorStates.forEach((key, state) { - if (state == 1) { - doorOffsets[key] = (doorOffsets[key] ?? 0.0) + 0.02; - if (doorOffsets[key]! >= 1.0) { - doorOffsets[key] = 1.0; - doorStates[key] = 2; // Mark as fully open - } - } - }); - - // 4. Process Wall Collision for Movement - const double margin = 0.3; - - double newX = player.x + moveStepX; - int checkX = (moveStepX > 0) - ? (newX + margin).toInt() - : (newX - margin).toInt(); - if (_isWalkable(checkX, player.y.toInt())) { - player.x = newX; - } - - double newY = player.y + moveStepY; - int checkY = (moveStepY > 0) - ? (newY + margin).toInt() - : (newY - margin).toInt(); - if (_isWalkable(player.x.toInt(), checkY)) { - player.y = newY; - } - - // 5. Update Entity Logic - List itemsToRemove = []; - - for (Entity entity in entities) { - if (entity is Enemy) { - entity.update( - elapsedMs: elapsed.inMilliseconds, - player: player.position, - isWalkable: _isWalkable, - onDamagePlayer: _takeDamage, - ); - } else if (entity is Collectible) { - double dx = player.x - entity.x; - double dy = player.y - entity.y; - if (math.sqrt(dx * dx + dy * dy) < 0.5) { - if (player.tryPickup(entity)) itemsToRemove.add(entity); - } - } - } - - if (itemsToRemove.isNotEmpty) { - entities.removeWhere((e) => itemsToRemove.contains(e)); - } - - // 6. Weapon Raycast & Attacking + // 3. Combat if (player.updateWeapon(elapsed.inMilliseconds)) { _performRaycastAttack(elapsed); } - // 7. Screen Effects - if (damageFlashOpacity > 0) { - damageFlashOpacity = math.max(0.0, damageFlashOpacity - 0.05); - } - + // 4. Render setState(() {}); } @@ -391,6 +337,83 @@ class _WolfRendererState extends State } } + void _updateDoors() { + doorStates.forEach((key, state) { + if (state == 1) { + // 1 = opening + doorOffsets[key] = (doorOffsets[key] ?? 0.0) + 0.02; // Slide speed + if (doorOffsets[key]! >= 1.0) { + doorOffsets[key] = 1.0; + doorStates[key] = 2; // Mark as fully open + } + } + }); + } + + void _applyMovementAndCollision() { + const double margin = 0.3; + + // X-axis collision + double newX = player.x + moveStepX; + int checkX = (moveStepX > 0) + ? (newX + margin).toInt() + : (newX - margin).toInt(); + + if (_isWalkable(checkX, player.y.toInt())) { + player.x = newX; + } + + // Y-axis collision + double newY = player.y + moveStepY; + int checkY = (moveStepY > 0) + ? (newY + margin).toInt() + : (newY - margin).toInt(); + + if (_isWalkable(player.x.toInt(), checkY)) { + player.y = newY; + } + } + + void _updateEntities(Duration elapsed) { + List itemsToRemove = []; + + for (Entity entity in entities) { + if (entity is Enemy) { + entity.update( + elapsedMs: elapsed.inMilliseconds, + player: player.position, + isWalkable: _isWalkable, + onDamagePlayer: _takeDamage, + ); + } + // Collectible Interaction Logic + else if (entity is Collectible) { + double dx = player.x - entity.x; + double dy = player.y - entity.y; + double dist = math.sqrt(dx * dx + dy * dy); + + // If player is close enough to the item + if (dist < 0.5) { + if (player.tryPickup(entity)) { + itemsToRemove.add(entity); + } + } + } + } + + // Remove the items that were successfully picked up + if (itemsToRemove.isNotEmpty) { + entities.removeWhere((e) => itemsToRemove.contains(e)); + } + } + + void _updateScreenEffects() { + // Fade out the damage flash smoothly + if (damageFlashOpacity > 0) { + damageFlashOpacity = math.max(0.0, damageFlashOpacity - 0.05); + } + } + @override Widget build(BuildContext context) { if (_isLoading) {